mirror of
https://github.com/diodeinc/pcb.git
synced 2026-09-14 20:17:19 +08:00
138 lines
5.0 KiB
Python
138 lines
5.0 KiB
Python
load("../io.zen", "io")
|
|
load("../interfaces.zen", "Net")
|
|
load("../units.zen", "Current", "Voltage")
|
|
load("../utils.zen", "format_value")
|
|
|
|
Mount = enum("SMD")
|
|
Package = enum("0201", "0402", "0603", "0805", "1206", "1210", "2010", "2512", "1812")
|
|
Color = enum("red", "green", "blue", "yellow", "yellow-green", "white", "amber", "orange", "pink", "uv", "other")
|
|
package = config(Package)
|
|
color = config(Color)
|
|
mpn = config(str, optional=True, help="Manufacturer Part Number")
|
|
manufacturer = config(str, optional=True, help="Manufacturer")
|
|
mount = config(Mount, default=Mount("SMD"), optional=True, help="Mounting type")
|
|
forward_voltage = config(Voltage, optional=True, help="Forward voltage drop")
|
|
forward_current = config(Current, optional=True, help="Typical forward current")
|
|
properties = {
|
|
"value": format_value("LED", color.value.upper(), forward_voltage),
|
|
"package": package,
|
|
"color": color,
|
|
}
|
|
|
|
if forward_voltage:
|
|
properties["forward_voltage"] = forward_voltage
|
|
if forward_current:
|
|
properties["forward_current"] = forward_current
|
|
|
|
A = io(Net)
|
|
K = io(Net)
|
|
|
|
|
|
def _footprint(package: Package) -> str:
|
|
kicad_footprints = {
|
|
Package("0201"): "../kicad-footprints/LED_SMD.pretty/LED_0201_0603Metric.kicad_mod",
|
|
Package("0402"): "../kicad-footprints/LED_SMD.pretty/LED_0402_1005Metric.kicad_mod",
|
|
Package("0603"): "../kicad-footprints/LED_SMD.pretty/LED_0603_1608Metric.kicad_mod",
|
|
Package("0805"): "../kicad-footprints/LED_SMD.pretty/LED_0805_2012Metric.kicad_mod",
|
|
Package("1206"): "../kicad-footprints/LED_SMD.pretty/LED_1206_3216Metric.kicad_mod",
|
|
Package("1210"): "../kicad-footprints/LED_SMD.pretty/LED_1210_3225Metric.kicad_mod",
|
|
Package("2010"): "../kicad-footprints/LED_SMD.pretty/LED_2010_5025Metric.kicad_mod",
|
|
Package("2512"): "../kicad-footprints/LED_SMD.pretty/LED_2512_6332Metric.kicad_mod",
|
|
Package("1812"): "../kicad-footprints/LED_SMD.pretty/LED_1812_4532Metric.kicad_mod",
|
|
}
|
|
if package not in kicad_footprints:
|
|
error("Invalid package: " + str(package))
|
|
return kicad_footprints[package]
|
|
|
|
|
|
def _symbol_name(color: Color):
|
|
color_symbols = {
|
|
Color("red"): "LED_Small_Filled_Red",
|
|
Color("green"): "LED_Small_Filled_Green",
|
|
Color("blue"): "LED_Small_Filled_Blue",
|
|
Color("yellow"): "LED_Small_Filled_Yellow",
|
|
Color("yellow-green"): "LED_Small_Filled_Green",
|
|
Color("white"): "LED_Small_Filled_White",
|
|
Color("amber"): "LED_Small_Filled_Amber",
|
|
Color("orange"): "LED_Small_Filled_Orange",
|
|
Color("pink"): "LED_Small_Filled_Pink",
|
|
Color("uv"): "LED_Small_Filled_UV",
|
|
}
|
|
return color_symbols.get(color, "LED_Small_Filled")
|
|
|
|
|
|
def _value(color: Color, package: Package) -> str:
|
|
color = str(color.value).title()
|
|
package = str(package.value)
|
|
return "LED {} {}".format(package, color)
|
|
|
|
|
|
def _spice_subcircuit_name(color: Color):
|
|
"""Returns the appropriate SPICE subcircuit name based on LED color."""
|
|
subcircuits = {
|
|
Color("red"): "LED_Red",
|
|
Color("green"): "LED_Green",
|
|
Color("blue"): "LED_Blue",
|
|
Color("yellow"): "LED_Yellow",
|
|
Color("yellow-green"): "LED_YellowGreen",
|
|
Color("white"): "LED_White",
|
|
Color("amber"): "LED_Amber",
|
|
Color("orange"): "LED_Orange",
|
|
Color("pink"): "LED_Pink",
|
|
Color("uv"): "LED_UV",
|
|
Color("other"): "LED_Other",
|
|
}
|
|
return subcircuits[color]
|
|
|
|
|
|
def _spice_args(color: Color, forward_voltage, forward_current):
|
|
"""Returns SPICE arguments based on LED parameters."""
|
|
# Set default IS values to achieve desired forward voltages
|
|
# Lower IS = higher forward voltage
|
|
color_is_values = {
|
|
Color("red"): "1e-16", # ~1.8V
|
|
Color("green"): "1e-18", # ~2.2V
|
|
Color("blue"): "1e-20", # ~3.2V
|
|
Color("yellow"): "1e-17", # ~2.0V
|
|
Color("yellow-green"): "5e-18", # ~2.1V
|
|
Color("white"): "1e-20", # ~3.2V
|
|
Color("amber"): "5e-18", # ~2.1V
|
|
Color("orange"): "1e-17", # ~2.0V
|
|
Color("pink"): "1e-19", # ~2.8V
|
|
Color("uv"): "1e-21", # ~3.5V
|
|
Color("other"): "1e-17", # ~2.0V
|
|
}
|
|
|
|
args = {
|
|
"IS": color_is_values.get(color, "1e-17"),
|
|
"N": "2.0", # Ideality factor for LEDs
|
|
"RS": "1", # Series resistance
|
|
"CJO": "10p", # Junction capacitance
|
|
}
|
|
|
|
# Note: forward_voltage and forward_current are for documentation/BOM only
|
|
# SPICE uses IS and N to determine the I-V characteristics
|
|
|
|
return args
|
|
|
|
|
|
Component(
|
|
name="LED",
|
|
part=builtin.Part(mpn=mpn, manufacturer=manufacturer) if mpn and manufacturer else None,
|
|
symbol=Symbol(library="../kicad-symbols/Device.kicad_symdir/LED_Small_Filled.kicad_sym", name=_symbol_name(color)),
|
|
footprint=File(_footprint(package)),
|
|
prefix="D",
|
|
spice_model=SpiceModel(
|
|
"spice/Led.lib",
|
|
_spice_subcircuit_name(color),
|
|
nets=[A, K],
|
|
args=_spice_args(color, forward_voltage, forward_current),
|
|
),
|
|
pins={
|
|
"K": K,
|
|
"A": A,
|
|
},
|
|
properties=properties,
|
|
type="led",
|
|
)
|