Skip to content

Commit 76ca6e7

Browse files
authored
Misc parts libraries cleanup (#490)
- Changes STM32F103 to generate the more common 8MHz crystal by default. Breaks compatibility, but there doesn't seem to be a clean better option. - Changes STM32F103 to generate the max memory variant by default. - Adds an optional reversed parameter to the PinSocket254Pair. - Changes diode power merges to model the output voltage based on the spec voltage drop instead of actual part values, to avoid a circular dependency where the output current depends on the output voltage (eg, if a LED is involved), and the diode can never be generated because it requires the output current. - Add UsbHostBridge. - Updates examples and netlists.
1 parent 9cfff0c commit 76ca6e7

7 files changed

Lines changed: 64 additions & 37 deletions

File tree

edg/electronics_model/UsbPort.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,30 @@ def contents(self) -> None:
2626
)
2727

2828

29+
class UsbHostBridge(PortBridge):
30+
def __init__(self) -> None:
31+
super().__init__()
32+
self.outer_port = self.Port(UsbHostPort.empty())
33+
self.inner_link = self.Port(UsbDevicePort.empty())
34+
35+
@override
36+
def contents(self) -> None:
37+
from .DigitalPorts import DigitalBidirBridge
38+
39+
super().contents()
40+
41+
self.dm_bridge = self.Block(DigitalBidirBridge())
42+
self.connect(self.outer_port.dm, self.dm_bridge.outer_port)
43+
self.connect(self.dm_bridge.inner_link, self.inner_link.dm)
44+
45+
self.dp_bridge = self.Block(DigitalBidirBridge())
46+
self.connect(self.outer_port.dp, self.dp_bridge.outer_port)
47+
self.connect(self.dp_bridge.inner_link, self.inner_link.dp)
48+
49+
2950
class UsbHostPort(Port[UsbLink]):
3051
link_type = UsbLink
52+
bridge_type = UsbHostBridge
3153

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

edg/parts/Microcontroller_Stm32f103.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ class Stm32f103_48_Device(Stm32f103Base_Device):
268268
}
269269
PACKAGE = "Package_QFP:LQFP-48_7x7mm_P0.5mm"
270270
PART = "STM32F103xxT6"
271-
LCSC_PART = "C8734" # C8T6 variant - basic part
271+
LCSC_PART = "C8304" # max memory CBT6 variant
272272
# C77994 for GD32F103C8T6, probably mostly drop-in compatible, NOT basic part
273273
LCSC_BASIC_PART = True
274274

@@ -298,7 +298,7 @@ class Stm32f103Base(
298298
GeneratorBlock,
299299
):
300300
DEVICE: Type[Stm32f103Base_Device] = Stm32f103Base_Device
301-
DEFAULT_CRYSTAL_FREQUENCY = 12 * MHertz(tol=0.005)
301+
DEFAULT_CRYSTAL_FREQUENCY = 8 * MHertz(tol=0.005) # as in common dev boards / eval boards
302302

303303
def __init__(self, **kwargs: Any) -> None:
304304
super().__init__(**kwargs)

edg/parts/PassiveConnector_Header.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,15 +53,30 @@ def part_footprint_mfr_name(self, length: int) -> Tuple[str, str, str]:
5353
)
5454

5555

56-
class PinSocket254Pair(SubboardConnectorPair):
56+
class PinSocket254Pair(SubboardConnectorPair, GeneratorBlock):
5757
"""2.54mm pin socket (external) - header (internal) pair for sub-board connectors,
58-
matching same pin-number to pin-number."""
58+
matching same pin-number to pin-number.
5959
60-
def __init__(self, length: IntLike = 0) -> None:
60+
Optionally can be reversed, with the header being on the external side and the socket being on the internal side."""
61+
62+
def __init__(self, length: IntLike = 0, *, reverse: BoolLike = False) -> None:
6163
super().__init__()
62-
self.ext = self.Block(PinSocket254(length), external=True)
63-
self.int = self.Block(PinHeader254(length))
64-
self.pins = self.Export(self.int.pins)
64+
self.length = self.ArgParameter(length)
65+
self.reverse = self.ArgParameter(reverse)
66+
self.generator_param(self.reverse)
67+
68+
self.pins = self.Port(Vector(Passive.empty()))
69+
70+
@override
71+
def generate(self) -> None:
72+
super().generate()
73+
if not self.get(self.reverse):
74+
self.ext: PassiveConnector = self.Block(PinSocket254(self.length), external=True)
75+
self.int: PassiveConnector = self.Block(PinHeader254(self.length))
76+
else:
77+
self.ext = self.Block(PinHeader254(self.length), external=True)
78+
self.int = self.Block(PinSocket254(self.length))
79+
self.connect(self.pins, self.int.pins)
6580
self.export_tap(self.pins, self.ext.pins)
6681

6782

edg/parts/PowerConditioning.py

Lines changed: 12 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,11 @@ def __init__(self, voltage_drop: RangeLike, reverse_recovery_time: RangeLike = R
1616

1717
self.pwr_in = self.Port(VoltageSink(current_draw=RangeExpr())) # high-priority source
1818
self.pwr_in_diode = self.Port(VoltageSink(current_draw=RangeExpr())) # low-priority source
19-
self.pwr_out = self.Port(VoltageSource(voltage_out=RangeExpr()))
19+
self.pwr_out = self.Port(
20+
VoltageSource( # use the spec voltage drop to avoid circular dependencies downstream
21+
voltage_out=self.pwr_in.link().voltage.hull(self.pwr_in_diode.link().voltage - voltage_drop),
22+
)
23+
)
2024

2125
self.diode = self.Block(
2226
Diode(
@@ -33,15 +37,6 @@ def __init__(self, voltage_drop: RangeLike, reverse_recovery_time: RangeLike = R
3337
)
3438
self.assign(self.pwr_in.current_draw, self.pwr_out.link().current_drawn)
3539
self.assign(self.pwr_in_diode.current_draw, self.pwr_out.link().current_drawn)
36-
self.assign(
37-
self.pwr_out.voltage_out,
38-
self.pwr_in.link().voltage.hull(
39-
(
40-
self.pwr_in_diode.link().voltage.lower() - self.diode.voltage_drop.upper(),
41-
self.pwr_in_diode.link().voltage.upper() - self.diode.voltage_drop.lower(),
42-
)
43-
),
44-
)
4540

4641
self.connect(self.pwr_in_diode.net, self.diode.anode)
4742
self.connect(self.pwr_out.net, self.pwr_in.net, self.diode.cathode)
@@ -55,7 +50,13 @@ def __init__(self, voltage_drop: RangeLike, reverse_recovery_time: RangeLike = (
5550

5651
self.pwr_in1 = self.Port(VoltageSink(current_draw=RangeExpr()))
5752
self.pwr_in2 = self.Port(VoltageSink(current_draw=RangeExpr()))
58-
self.pwr_out = self.Port(VoltageSource(voltage_out=RangeExpr()))
53+
self.pwr_out = self.Port(
54+
VoltageSource( # use the spec voltage drop to avoid circular dependencies downstream
55+
voltage_out=(self.pwr_in1.link().voltage - voltage_drop).hull(
56+
self.pwr_in2.link().voltage - voltage_drop
57+
)
58+
)
59+
)
5960

6061
output_lower = (
6162
self.pwr_in1.link().voltage.lower().min(self.pwr_in2.link().voltage.lower())
@@ -78,17 +79,6 @@ def __init__(self, voltage_drop: RangeLike, reverse_recovery_time: RangeLike = (
7879
)
7980
)
8081

81-
self.assign(
82-
self.pwr_out.voltage_out,
83-
(
84-
(self.pwr_in1.link().voltage.lower() - self.diode1.actual_voltage_drop.upper()).min(
85-
self.pwr_in2.link().voltage.lower() - self.diode2.actual_voltage_drop.upper()
86-
),
87-
(self.pwr_in1.link().voltage.upper() - self.diode1.actual_voltage_drop.lower()).max(
88-
self.pwr_in2.link().voltage.upper() - self.diode2.actual_voltage_drop.lower()
89-
),
90-
),
91-
)
9282
self.assign(self.pwr_in1.current_draw, self.pwr_out.link().current_drawn)
9383
self.assign(self.pwr_in2.current_draw, self.pwr_out.link().current_drawn)
9484

examples/Keyboard/Keyboard.net.ref

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,8 @@
188188
(property (name "edg_path") (value "mcu.crystal.package"))
189189
(property (name "edg_short_path") (value "mcu.crystal.package"))
190190
(property (name "edg_refdes") (value "X1"))
191-
(property (name "edg_part") (value "X322512MSB4SI (Yangxing Tech)"))
192-
(property (name "edg_value") (value "12MHz SMD Crystal Resonator 20pF ±10ppm ±30ppm -40℃~+85℃ SMD3225-4P Crystals ROHS"))
191+
(property (name "edg_part") (value "X32258MOB4SI (Yangxing Tech)"))
192+
(property (name "edg_value") (value "8MHz SMD Crystal Resonator 12pF ±10ppm ±30ppm -40℃~+85℃ SMD3225-4P Crystals ROHS"))
193193
(sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/"))
194194
(tstamps "0b4e02cd"))
195195
(comp (ref "C9")
@@ -200,8 +200,8 @@
200200
(property (name "edg_path") (value "mcu.crystal.cap_a"))
201201
(property (name "edg_short_path") (value "mcu.crystal.cap_a"))
202202
(property (name "edg_refdes") (value "C9"))
203-
(property (name "edg_part") (value "CL10C220JB8NNNC (Samsung Electro-Mechanics)"))
204-
(property (name "edg_value") (value "50V 22pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS"))
203+
(property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)"))
204+
(property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS"))
205205
(sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/"))
206206
(tstamps "05e701f5"))
207207
(comp (ref "C10")
@@ -212,8 +212,8 @@
212212
(property (name "edg_path") (value "mcu.crystal.cap_b"))
213213
(property (name "edg_short_path") (value "mcu.crystal.cap_b"))
214214
(property (name "edg_refdes") (value "C10"))
215-
(property (name "edg_part") (value "CL10C220JB8NNNC (Samsung Electro-Mechanics)"))
216-
(property (name "edg_value") (value "50V 22pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS"))
215+
(property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)"))
216+
(property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS"))
217217
(sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/"))
218218
(tstamps "05e801f6"))
219219
(comp (ref "SW1")

examples/test_swd_debugger.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,6 @@ def refinements(self) -> Refinements:
170170
],
171171
instance_values=[
172172
(["refdes_prefix"], "S"), # unique refdes for panelization
173-
(["mcu", "crystal", "frequency"], Range.from_tolerance(8000000, 0.005)),
174173
(
175174
["mcu", "pin_assigns"],
176175
[

examples/test_tofarray.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ def refinements(self) -> Refinements:
136136
(["can", "conn"], MolexSl),
137137
],
138138
instance_values=[
139+
(["mcu", "crystal", "frequency"], Range.from_tolerance(12000000, 0.005)), # legacy default crystal
139140
(
140141
["mcu", "pin_assigns"],
141142
[

0 commit comments

Comments
 (0)