Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 21 additions & 21 deletions edg/abstract_parts/AbstractBjt.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,31 +7,11 @@
from .StandardFootprint import StandardFootprint, HasStandardFootprint


class BjtStandardFootprint(StandardFootprint['Bjt']):
REFDES_PREFIX = 'Q'

FOOTPRINT_PINNING_MAP = {
(
'Package_TO_SOT_SMD:SOT-23',
'Package_TO_SOT_SMD:SOT-323_SC-70',
): lambda block: {
'1': block.base,
'2': block.emitter,
'3': block.collector,
},
'Package_TO_SOT_SMD:SOT-89-3': lambda block: {
'1': block.base,
'2': block.collector,
'3': block.emitter,
},
}


@abstract_block
class Bjt(KiCadImportableBlock, DiscreteSemiconductor, HasStandardFootprint):
"""Base class for untyped BJTs
"""
_STANDARD_FOOTPRINT = BjtStandardFootprint
_STANDARD_FOOTPRINT = lambda: BjtStandardFootprint

def symbol_pinning(self, symbol_name: str) -> Dict[str, BasePort]:
# TODO actually check that the device channel corresponds with the schematic?
Expand Down Expand Up @@ -83,6 +63,26 @@ def contents(self) -> None:
)


class BjtStandardFootprint(StandardFootprint[Bjt]):
REFDES_PREFIX = 'Q'

FOOTPRINT_PINNING_MAP = {
(
'Package_TO_SOT_SMD:SOT-23',
'Package_TO_SOT_SMD:SOT-323_SC-70',
): lambda block: {
'1': block.base,
'2': block.emitter,
'3': block.collector,
},
'Package_TO_SOT_SMD:SOT-89-3': lambda block: {
'1': block.base,
'2': block.collector,
'3': block.emitter,
},
}


class TableBjt(PartsTableSelector, Bjt):
VCE_RATING = PartsTableColumn(Range)
ICE_RATING = PartsTableColumn(Range)
Expand Down
144 changes: 72 additions & 72 deletions edg/abstract_parts/AbstractCapacitor.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,77 +11,6 @@
from .StandardFootprint import StandardFootprint, HasStandardFootprint


class CapacitorStandardFootprint(StandardFootprint['Capacitor']):
REFDES_PREFIX = 'C'

# IMPORTANT! DummyFootprint doesn't use this, it will break on anything that isn't this pinning
FOOTPRINT_PINNING_MAP = {
(
'Capacitor_SMD:C_0201_0603Metric',
'Capacitor_SMD:C_0402_1005Metric',
'Capacitor_SMD:C_0603_1608Metric',
'Capacitor_SMD:C_0805_2012Metric',
'Capacitor_SMD:C_1206_3216Metric',
'Capacitor_SMD:C_1210_3225Metric',
'Capacitor_SMD:C_1812_4532Metric',
'Capacitor_SMD:C_2512_6332Metric',

'Capacitor_SMD:CP_Elec_3x5.3',
'Capacitor_SMD:CP_Elec_3x5.4',
'Capacitor_SMD:CP_Elec_4x3',
'Capacitor_SMD:CP_Elec_4x3.9',
'Capacitor_SMD:CP_Elec_4x4.5',
'Capacitor_SMD:CP_Elec_4x5.3',
'Capacitor_SMD:CP_Elec_4x5.4',
'Capacitor_SMD:CP_Elec_4x5.7',
'Capacitor_SMD:CP_Elec_4x5.8',
'Capacitor_SMD:CP_Elec_5x3',
'Capacitor_SMD:CP_Elec_5x3.9',
'Capacitor_SMD:CP_Elec_5x4.4',
'Capacitor_SMD:CP_Elec_5x4.5',
'Capacitor_SMD:CP_Elec_5x5.3',
'Capacitor_SMD:CP_Elec_5x5.4',
'Capacitor_SMD:CP_Elec_5x5.7',
'Capacitor_SMD:CP_Elec_5x5.8',
'Capacitor_SMD:CP_Elec_5x5.9',
'Capacitor_SMD:CP_Elec_6.3x3',
'Capacitor_SMD:CP_Elec_6.3x3.9',
'Capacitor_SMD:CP_Elec_6.3x4.5',
'Capacitor_SMD:CP_Elec_6.3x4.9',
'Capacitor_SMD:CP_Elec_6.3x5.2',
'Capacitor_SMD:CP_Elec_6.3x5.3',
'Capacitor_SMD:CP_Elec_6.3x5.4',
'Capacitor_SMD:CP_Elec_6.3x5.7',
'Capacitor_SMD:CP_Elec_6.3x5.8',
'Capacitor_SMD:CP_Elec_6.3x5.9',
'Capacitor_SMD:CP_Elec_6.3x7.7',
'Capacitor_SMD:CP_Elec_6.3x9.9',
'Capacitor_SMD:CP_Elec_8x5.4',
'Capacitor_SMD:CP_Elec_8x6.2',
'Capacitor_SMD:CP_Elec_8x6.5',
'Capacitor_SMD:CP_Elec_8x6.7',
'Capacitor_SMD:CP_Elec_8x6.9',
'Capacitor_SMD:CP_Elec_8x10',
'Capacitor_SMD:CP_Elec_8x10.5',
'Capacitor_SMD:CP_Elec_8x11.9',
'Capacitor_SMD:CP_Elec_10x7.7',
'Capacitor_SMD:CP_Elec_10x7.9',
'Capacitor_SMD:CP_Elec_10x10',
'Capacitor_SMD:CP_Elec_10x10.5',
'Capacitor_SMD:CP_Elec_10x12.5',
'Capacitor_SMD:CP_Elec_10x12.6',
'Capacitor_SMD:CP_Elec_10x14.3',
'Capacitor_SMD:CP_Elec_16x17.5',
'Capacitor_SMD:CP_Elec_16x22',
'Capacitor_SMD:CP_Elec_18x7.5',
'Capacitor_SMD:CP_Elec_18x22',
): lambda block: {
'1': block.pos,
'2': block.neg,
},
}


@abstract_block
class UnpolarizedCapacitor(PassiveComponent):
"""Base type for a capacitor, that defines its parameters and without ports (since capacitors can be polarized)"""
Expand Down Expand Up @@ -119,7 +48,7 @@ def contents(self) -> None:
@abstract_block
class Capacitor(UnpolarizedCapacitor, KiCadInstantiableBlock, HasStandardFootprint):
"""Polarized capacitor, which we assume will be the default"""
_STANDARD_FOOTPRINT = CapacitorStandardFootprint
_STANDARD_FOOTPRINT = lambda: CapacitorStandardFootprint

CAPACITOR_REGEX = re.compile("^" + f"([\d.{PartParserUtil.SI_PREFIXES}]+)\s*F?" +
"\s*" + "((?:\+-|\+/-|±)?\s*[\d.]+\s*%)?" +
Expand Down Expand Up @@ -156,6 +85,77 @@ def __init__(self, *args: Any, **kwargs: Any) -> None:
self.neg = self.Port(Passive.empty())


class CapacitorStandardFootprint(StandardFootprint[Capacitor]):
REFDES_PREFIX = 'C'

# IMPORTANT! DummyFootprint doesn't use this, it will break on anything that isn't this pinning
FOOTPRINT_PINNING_MAP = {
(
'Capacitor_SMD:C_0201_0603Metric',
'Capacitor_SMD:C_0402_1005Metric',
'Capacitor_SMD:C_0603_1608Metric',
'Capacitor_SMD:C_0805_2012Metric',
'Capacitor_SMD:C_1206_3216Metric',
'Capacitor_SMD:C_1210_3225Metric',
'Capacitor_SMD:C_1812_4532Metric',
'Capacitor_SMD:C_2512_6332Metric',

'Capacitor_SMD:CP_Elec_3x5.3',
'Capacitor_SMD:CP_Elec_3x5.4',
'Capacitor_SMD:CP_Elec_4x3',
'Capacitor_SMD:CP_Elec_4x3.9',
'Capacitor_SMD:CP_Elec_4x4.5',
'Capacitor_SMD:CP_Elec_4x5.3',
'Capacitor_SMD:CP_Elec_4x5.4',
'Capacitor_SMD:CP_Elec_4x5.7',
'Capacitor_SMD:CP_Elec_4x5.8',
'Capacitor_SMD:CP_Elec_5x3',
'Capacitor_SMD:CP_Elec_5x3.9',
'Capacitor_SMD:CP_Elec_5x4.4',
'Capacitor_SMD:CP_Elec_5x4.5',
'Capacitor_SMD:CP_Elec_5x5.3',
'Capacitor_SMD:CP_Elec_5x5.4',
'Capacitor_SMD:CP_Elec_5x5.7',
'Capacitor_SMD:CP_Elec_5x5.8',
'Capacitor_SMD:CP_Elec_5x5.9',
'Capacitor_SMD:CP_Elec_6.3x3',
'Capacitor_SMD:CP_Elec_6.3x3.9',
'Capacitor_SMD:CP_Elec_6.3x4.5',
'Capacitor_SMD:CP_Elec_6.3x4.9',
'Capacitor_SMD:CP_Elec_6.3x5.2',
'Capacitor_SMD:CP_Elec_6.3x5.3',
'Capacitor_SMD:CP_Elec_6.3x5.4',
'Capacitor_SMD:CP_Elec_6.3x5.7',
'Capacitor_SMD:CP_Elec_6.3x5.8',
'Capacitor_SMD:CP_Elec_6.3x5.9',
'Capacitor_SMD:CP_Elec_6.3x7.7',
'Capacitor_SMD:CP_Elec_6.3x9.9',
'Capacitor_SMD:CP_Elec_8x5.4',
'Capacitor_SMD:CP_Elec_8x6.2',
'Capacitor_SMD:CP_Elec_8x6.5',
'Capacitor_SMD:CP_Elec_8x6.7',
'Capacitor_SMD:CP_Elec_8x6.9',
'Capacitor_SMD:CP_Elec_8x10',
'Capacitor_SMD:CP_Elec_8x10.5',
'Capacitor_SMD:CP_Elec_8x11.9',
'Capacitor_SMD:CP_Elec_10x7.7',
'Capacitor_SMD:CP_Elec_10x7.9',
'Capacitor_SMD:CP_Elec_10x10',
'Capacitor_SMD:CP_Elec_10x10.5',
'Capacitor_SMD:CP_Elec_10x12.5',
'Capacitor_SMD:CP_Elec_10x12.6',
'Capacitor_SMD:CP_Elec_10x14.3',
'Capacitor_SMD:CP_Elec_16x17.5',
'Capacitor_SMD:CP_Elec_16x22',
'Capacitor_SMD:CP_Elec_18x7.5',
'Capacitor_SMD:CP_Elec_18x22',
): lambda block: {
'1': block.pos,
'2': block.neg,
},
}


@abstract_block
class CeramicCapacitor(Capacitor):
"""Abstract base class for ceramic capacitors, which appear more ideal in terms of lower ESP"""
Expand Down
50 changes: 25 additions & 25 deletions edg/abstract_parts/AbstractCrystal.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,31 @@
from .StandardFootprint import StandardFootprint, HasStandardFootprint


@abstract_block
class Crystal(DiscreteComponent, HasStandardFootprint):
_STANDARD_FOOTPRINT = lambda: CrystalStandardFootprint

def __init__(self, frequency: RangeLike) -> None:
"""Discrete crystal component."""
super().__init__()

self.frequency = self.ArgParameter(frequency)
self.actual_frequency = self.Parameter(RangeExpr())
self.actual_capacitance = self.Parameter(FloatExpr())

self.crystal = self.Port(CrystalPort(self.actual_frequency), [InOut]) # set by subclass
self.gnd = self.Port(Ground(), [Common])

def contents(self) -> None:
super().contents()

self.description = DescriptionString(
"<b>frequency:</b> ", DescriptionString.FormatUnits(self.actual_frequency, "Hz"),
" <b>of spec:</b> ", DescriptionString.FormatUnits(self.frequency, "Hz"), "\n",
"<b>capacitance:</b> ", DescriptionString.FormatUnits(self.actual_capacitance, "F")
)


class CrystalStandardFootprint(StandardFootprint['Crystal']):
REFDES_PREFIX = 'X'

Expand All @@ -31,31 +56,6 @@ class CrystalStandardFootprint(StandardFootprint['Crystal']):
}


@abstract_block
class Crystal(DiscreteComponent, HasStandardFootprint):
_STANDARD_FOOTPRINT = CrystalStandardFootprint

def __init__(self, frequency: RangeLike) -> None:
"""Discrete crystal component."""
super().__init__()

self.frequency = self.ArgParameter(frequency)
self.actual_frequency = self.Parameter(RangeExpr())
self.actual_capacitance = self.Parameter(FloatExpr())

self.crystal = self.Port(CrystalPort(self.actual_frequency), [InOut]) # set by subclass
self.gnd = self.Port(Ground(), [Common])

def contents(self) -> None:
super().contents()

self.description = DescriptionString(
"<b>frequency:</b> ", DescriptionString.FormatUnits(self.actual_frequency, "Hz"),
" <b>of spec:</b> ", DescriptionString.FormatUnits(self.frequency, "Hz"), "\n",
"<b>capacitance:</b> ", DescriptionString.FormatUnits(self.actual_capacitance, "F")
)


@non_library
class TableCrystal(PartsTableSelector, Crystal):
FREQUENCY = PartsTableColumn(Range)
Expand Down
26 changes: 13 additions & 13 deletions edg/abstract_parts/AbstractDiodes.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,19 @@
from .StandardFootprint import StandardFootprint, HasStandardFootprint


@non_library
class BaseDiode(DiscreteSemiconductor, HasStandardFootprint):
"""Base class for diodes, with anode and cathode pins, including a very wide range of devices.
"""
_STANDARD_FOOTPRINT = lambda: DiodeStandardFootprint

def __init__(self) -> None:
super().__init__()

self.anode = self.Port(Passive.empty())
self.cathode = self.Port(Passive.empty())


class DiodeStandardFootprint(StandardFootprint['BaseDiode']):
REFDES_PREFIX = 'D'

Expand All @@ -35,19 +48,6 @@ class DiodeStandardFootprint(StandardFootprint['BaseDiode']):
}


@non_library
class BaseDiode(DiscreteSemiconductor, HasStandardFootprint):
"""Base class for diodes, with anode and cathode pins, including a very wide range of devices.
"""
_STANDARD_FOOTPRINT = DiodeStandardFootprint

def __init__(self) -> None:
super().__init__()

self.anode = self.Port(Passive.empty())
self.cathode = self.Port(Passive.empty())


@abstract_block
class Diode(KiCadImportableBlock, BaseDiode):
"""Base class for untyped diodes
Expand Down
46 changes: 22 additions & 24 deletions edg/abstract_parts/AbstractFerriteBead.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,30 +7,9 @@
from .StandardFootprint import StandardFootprint, HasStandardFootprint


class FerriteBeadStandardFootprint(StandardFootprint['FerriteBead']):
REFDES_PREFIX = 'FB'

FOOTPRINT_PINNING_MAP = {
(
'Inductor_SMD:L_0201_0603Metric',
'Inductor_SMD:L_0402_1005Metric',
'Inductor_SMD:L_0603_1608Metric',
'Inductor_SMD:L_0805_2012Metric',
'Inductor_SMD:L_1206_3216Metric',
'Inductor_SMD:L_1210_3225Metric',
'Inductor_SMD:L_1812_4532Metric',
'Inductor_SMD:L_2010_5025Metric',
'Inductor_SMD:L_2512_6332Metric',
): lambda block: {
'1': block.a,
'2': block.b,
},
}


@abstract_block
class FerriteBead(PassiveComponent, KiCadImportableBlock, HasStandardFootprint):
_STANDARD_FOOTPRINT = FerriteBeadStandardFootprint
_STANDARD_FOOTPRINT = lambda: FerriteBeadStandardFootprint

def symbol_pinning(self, symbol_name: str) -> Dict[str, BasePort]:
assert symbol_name in ('Device:L_Ferrite', 'Device:L_Ferrite_Small')
Expand Down Expand Up @@ -64,10 +43,29 @@ def contents(self) -> None:
)


class FerriteBeadStandardFootprint(StandardFootprint[FerriteBead]):
REFDES_PREFIX = 'FB'

FOOTPRINT_PINNING_MAP = {
(
'Inductor_SMD:L_0201_0603Metric',
'Inductor_SMD:L_0402_1005Metric',
'Inductor_SMD:L_0603_1608Metric',
'Inductor_SMD:L_0805_2012Metric',
'Inductor_SMD:L_1206_3216Metric',
'Inductor_SMD:L_1210_3225Metric',
'Inductor_SMD:L_1812_4532Metric',
'Inductor_SMD:L_2010_5025Metric',
'Inductor_SMD:L_2512_6332Metric',
): lambda block: {
'1': block.a,
'2': block.b,
},
}


@non_library
class TableFerriteBead(PartsTableSelector, FerriteBead):
Copy link

Copilot AI Nov 28, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The _STANDARD_FOOTPRINT assignment that was previously at line 70 has been removed. This appears to be an unintended deletion rather than a deliberate change, as other similar table classes retain their footprint assignments. Verify if this is intentional or if it should inherit the lambda from the parent FerriteBead class.

Suggested change
class TableFerriteBead(PartsTableSelector, FerriteBead):
class TableFerriteBead(PartsTableSelector, FerriteBead):
_STANDARD_FOOTPRINT = lambda: FerriteBeadStandardFootprint

Copilot uses AI. Check for mistakes.
_STANDARD_FOOTPRINT = FerriteBeadStandardFootprint

CURRENT_RATING = PartsTableColumn(Range)
HF_IMPEDANCE = PartsTableColumn(Range)
DC_RESISTANCE = PartsTableColumn(Range)
Expand Down
Loading