From 092e937f994ba27d773de86aa85967b69daeae69 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 27 Jun 2026 23:50:39 -0700 Subject: [PATCH 01/41] wip --- reference.md | 160 ++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 158 insertions(+), 2 deletions(-) diff --git a/reference.md b/reference.md index 5febe3fb4..460e39860 100644 --- a/reference.md +++ b/reference.md @@ -1,7 +1,163 @@ # Quick Reference -A simplified EDG EDSL guide, primarily as a reference for those who have been through the [getting started guide](getting-started.md). +A short reference for writing HDL code. +New? Consider reading through the [getting started guide](getting-started.md). + + +## For System Builders + +### DesignTop Block +`Block`s represent a subcircuit (including the top-level circuit) and contain inner blocks and connections between them. + +```python +class MyBoard(SimpleBoardTop): + def contents(self) -> None: + # declare subblocks and connections here + super().contents() # required to call this superclass method + self.mcu = self.Block(IoController()) + self.led = self.Block(IndicatorLed()) + self.connect(self.mcu.gpio.request("led"), self.led.signal) + self.connect(self.mcu.gnd, self.led.gnd) + + def refinements(self) -> Refinements: + # refinements describe modifications across the design hierarchy + return super().refinements() + Refinements( + class_refinements=[ + (IoController, Esp32c3), # replace all abstract IoController with Esp32c3 + ], + instance_refinements=[ + (["mcu"], Esp32c3), # replace mcu with Esp32c3, redundant with the above class refinement + ], + instance_values=[ + ( + ["mcu", "pin_assigns"], # assign IOs to these physical pins + [ + "led=3", # assign led to physical pin 3 + ], + ) + ], + ) +``` + +- `SimpleBoardTop` maps abstract passive components to the JLC parts library and relaxes some strict constraints that do not matter for maker-type boards. +- Alternatively, use `DesignTop` (which has no default mappings) or `JlcBoardTop` (which has JLC part mappings). + +### Block definition + +```python +self.block_name = self.Block(BlockType(...)) +``` + +- All blocks must have a unique name as a `self` variable (this preserves netlist stability for layout). +- Some blocks may take arguments, see their `__init__` for details. +- Builtin parts (like ICs) are in [the parts folder](edg/parts) and builtin circuits are in [the circuits folder](edg/circuits). +- Abstract blocks can be instantiated, but require a refinement in the top-level design. + - Some DesignTop subclasses like `SimpleBoardTop` provide default refinements. + +#### Range Arguments + +```python +self.reg = self.Block(LinearRegulator(3.3 * Volt(tol=0.05))) +``` + +- Blocks commonly take arguments as a range-like type, typically a specification for an allowable range accounting for tolerance stackup. + +#### ElementDict + +```python +self.block_name = ElementDict[IndicatorLed]() +for i in range(4): + self.block_name[i] = self.Block(IndicatorLed()) +``` + +- `ElementDict` provides an internal namespace for blocks, by index name. +- Use this to construct (and uniquely name) arrays of blocks. + +### Connections + +```python +self.connect(self.block1.port, self.block2.port, ...) +``` + +- `self.connect` connects ports on blocks, inferring the link type from the port types in the connection. +- `self.connect` returns a `Connection` object, which can be used in connections. +- Optionally assign a name to the `Connection` by assigning to a `self` variable. + +#### Implicit Connection Blocks + +```python +with self.implicit_connect( + ImplicitConnect(self.pwr, [Power]), + ImplicitConnect(self.gnd, [Common]), +) as imp: + self.block_name = imp.Block(BlockType(...)) +``` + +- `self.implicit_connect` creates a scope for implicit connections, which automatically connects ports on instantiated blocks by matching on tags like `Power` and `Common`. +- This is typically used to implicitly connect power (`Power` tag) and ground (`Common` tag) ports. + +#### Chain Connections + +```python +(self.led,), _ = self.chain(imp.Block(IndicatorSinkLed()), self.mcu.gpio.request("led")) +``` + +- `self.chain` connects ports in a chain, from left to right. +- Blocks in the chain are connected to: + - their `Input` tagged port, for an incoming connection from the left, + - their `Output` tagged port, for an outgoing connection to the right, + - their `InOut` tagged port, for both incoming and outgoing connections (tapped connection). +- This returns a tuple of `(blocks...), chain`. + Blocks must be named, the chain object can be optionally named to name the interior nets. + +#### .connected(...) + +```python +self.tp_gnd = self.Block(GroundTestPoint()).connected(self.gnd) +``` + +- Some (but far from all) blocks define a `.connected(...)` as a shorthand connection method, see each class's API for details. + +### IoController + +```python +self.mcu = imp.Block(IoController()) +self.connect(self.mcu.gpio.request("led"), self.led.signal) +``` + +- `IoController` is an abstract class for any programmable IO controller, typically microcontrollers, but also including FPGAs. +- `IoController`s have a `gnd` and `pwr` input power ports, and `gpio`, `adc`, `spi`, `i2c`, `uart`, and `usb` Vector IO ports which elements can be requested from. +- Not all `IoController`s support all IO types, see each class's API for details. +- The `request(...)` name is used in the `pin_assigns` refinement, with each entry specified as either `led=3` (by footprint pin number) or `led=GPIO4` (by IO name, see each class's API for details). + +### Mixins + +```python +self.mcu.with_mixin(IoControllerWifi()) +self.connect(self.can.controller, self.mcu.with_mixin(IoControllerCan()).can.request("can")) +``` + +- Mixins are a way to require additional functionality on an abstract block, they restrict refinements to concrete classes that implement the mixin. +- Mixins can define ports and parameters. +- IoController has these mixins: + - defining IO ports: `IoControllerDac`, `IoControllerI2cTarget`, `IoControllerSpiPeripheral`, `IoControllerTouchDriver`, `IoControllerCan`, `IoControllerUsbCc`, `IoControllerI2s`, `IoControllerDvp8` + - connectivity requirements only: `IoControllerWifi`, `IoControllerBluetooth`, `IoControllerBle` + - defining power ports, typically for microcontroller dev boards: `IoControllerPowerOut`, `IoControllerUsbOut`, `IoControllerVin` + +### Connector Blocks + + +### Connector Pairs + + +### Refinements + + +### Overriding Values / "Waiving" ERCs + + + +## For Library Builders -_Some documentation may be out of date._ ## Core Primitives From 305079000f7721dbed4749a6e2c647ad64de99a4 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 00:06:27 -0700 Subject: [PATCH 02/41] Update reference.md --- reference.md | 63 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 53 insertions(+), 10 deletions(-) diff --git a/reference.md b/reference.md index 460e39860..988558e81 100644 --- a/reference.md +++ b/reference.md @@ -1,5 +1,6 @@ # Quick Reference A short reference for writing HDL code. + New? Consider reading through the [getting started guide](getting-started.md). @@ -28,12 +29,7 @@ class MyBoard(SimpleBoardTop): (["mcu"], Esp32c3), # replace mcu with Esp32c3, redundant with the above class refinement ], instance_values=[ - ( - ["mcu", "pin_assigns"], # assign IOs to these physical pins - [ - "led=3", # assign led to physical pin 3 - ], - ) + (["mcu", "pin_assigns"], ["led=3"]) # assign LED to footprint pin 3 ], ) ``` @@ -41,6 +37,7 @@ class MyBoard(SimpleBoardTop): - `SimpleBoardTop` maps abstract passive components to the JLC parts library and relaxes some strict constraints that do not matter for maker-type boards. - Alternatively, use `DesignTop` (which has no default mappings) or `JlcBoardTop` (which has JLC part mappings). + ### Block definition ```python @@ -50,6 +47,7 @@ self.block_name = self.Block(BlockType(...)) - All blocks must have a unique name as a `self` variable (this preserves netlist stability for layout). - Some blocks may take arguments, see their `__init__` for details. - Builtin parts (like ICs) are in [the parts folder](edg/parts) and builtin circuits are in [the circuits folder](edg/circuits). +- See [the examples](examples/) for common blocks and how they're used. - Abstract blocks can be instantiated, but require a refinement in the top-level design. - Some DesignTop subclasses like `SimpleBoardTop` provide default refinements. @@ -72,6 +70,7 @@ for i in range(4): - `ElementDict` provides an internal namespace for blocks, by index name. - Use this to construct (and uniquely name) arrays of blocks. + ### Connections ```python @@ -117,6 +116,47 @@ self.tp_gnd = self.Block(GroundTestPoint()).connected(self.gnd) - Some (but far from all) blocks define a `.connected(...)` as a shorthand connection method, see each class's API for details. + +### Refinements + +```python +def refinements(self) -> Refinements: + return super().refinements() + Refinements( + class_refinements=[ + (IoController, Esp32c3), + ], + instance_refinements=[ + (["mcu"], Esp32c3), + ], + instance_values=[ + (["mcu", "pin_assigns"], ["led=3"]) + ], + class_values=[ + (SelectorArea, ["footprint_area"], Range.from_lower(1.5)), + ] + ) +``` + +- Refinements allow specifying, at the top level, modification across the design hierarchy. +- `class_refinements` replaces all instances of a block type with a subclass. +- `instance_refinements` replaces a specific instance of a block with a subclass. + The instance is specified as a path, as a list of block names from the root. +- `instance_values` sets a parameter value on a specific instance of a block, specified as a path. +- `class_values` sets a parameter value on all instances of a block type. + It is specified as a class, then a sub-path to the parameter. + + +### Parts Table Parts + +- Some blocks, particularly discrete components like `Resistor`s and `Fet`s, are implemented as automatic selection from a parts table. +- These are some common top-level refinements: + - Class refinement`(SelectorArea, ["footprint_area"], Range.from_lower(1.5))`: require a minimum footprint courtyard area in mm² + - These are common minimum areas for passives: 01005=0.72, 0201=0.98, 0402=1.74, 0603=4.32, 0805=6.38, 1206=10.21. + - Instance refinement `(["part_table_block", "excluded_parts"], ["1N2127"])`: exclude parts from selection, e.g., if they're out-of-stock. + - Instance refinement `(["part_table_block", "part"], "1N2127")`: require a particular part. + - Instance refinement `(["part_table_block", "footprint_spec"], "Diode_SMD:D_SMA")`: require a particular footprint. + + ### IoController ```python @@ -129,28 +169,31 @@ self.connect(self.mcu.gpio.request("led"), self.led.signal) - Not all `IoController`s support all IO types, see each class's API for details. - The `request(...)` name is used in the `pin_assigns` refinement, with each entry specified as either `led=3` (by footprint pin number) or `led=GPIO4` (by IO name, see each class's API for details). + ### Mixins ```python -self.mcu.with_mixin(IoControllerWifi()) +# require additional ports defined by a mixin self.connect(self.can.controller, self.mcu.with_mixin(IoControllerCan()).can.request("can")) + +# require a mixin as a refinement constraint only +self.mcu.with_mixin(IoControllerWifi()) ``` - Mixins are a way to require additional functionality on an abstract block, they restrict refinements to concrete classes that implement the mixin. -- Mixins can define ports and parameters. +- Mixins can optionally define ports and parameters. - IoController has these mixins: - defining IO ports: `IoControllerDac`, `IoControllerI2cTarget`, `IoControllerSpiPeripheral`, `IoControllerTouchDriver`, `IoControllerCan`, `IoControllerUsbCc`, `IoControllerI2s`, `IoControllerDvp8` - connectivity requirements only: `IoControllerWifi`, `IoControllerBluetooth`, `IoControllerBle` - defining power ports, typically for microcontroller dev boards: `IoControllerPowerOut`, `IoControllerUsbOut`, `IoControllerVin` + ### Connector Blocks ### Connector Pairs -### Refinements - ### Overriding Values / "Waiving" ERCs From 55afac7e82340df1b8ee2834f22b4001445b0d73 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 01:08:23 -0700 Subject: [PATCH 03/41] split out --- reference.md | 260 ++++++++----------------------------------- reference_library.md | 223 +++++++++++++++++++++++++++++++++++++ 2 files changed, 271 insertions(+), 212 deletions(-) create mode 100644 reference_library.md diff --git a/reference.md b/reference.md index 988558e81..20de0dad3 100644 --- a/reference.md +++ b/reference.md @@ -1,10 +1,11 @@ # Quick Reference + A short reference for writing HDL code. New? Consider reading through the [getting started guide](getting-started.md). +Also see the [reference for building subcircuit / part library blocks](reference_library.md). -## For System Builders ### DesignTop Block `Block`s represent a subcircuit (including the top-level circuit) and contain inner blocks and connections between them. @@ -190,226 +191,61 @@ self.mcu.with_mixin(IoControllerWifi()) ### Connector Blocks - -### Connector Pairs - - - -### Overriding Values / "Waiving" ERCs - - - -## For Library Builders - - -## Core Primitives - -### Parameters -- `BoolExpr`: boolean (true / false) variable - - Supports standard boolean operations -- `FloatExpr`: numeric variable - - Suppers standard numeric operations -- `RangeExpr`: range (interval) variable - - Supports standard numeric operations (multiplication and division are undefined), some set operations (`.within(other)`, `.contains(other)`, `.intersect(other)`), and get operations (`.lower()`, `.upper()`) -- `StringExpr`: string (text) variable - - Supports equality operations only - -### Blocks -Blocks represent a subcircuit (or hierarchical schematic sheet), and consist of boundary ports and internal subblocks and connections (links) between ports on those subblocks. - -Skeleton structure: ```python -class MyBlock(Block): - def __init__(self) -> None: - super().__init__() # essential to call the superclass method beforehand to initialize state - # declare ports here, and subblocks whose ports are exported - - def contents(self) -> None: - super().contents() # essential to call the superclass method beforehand to initialize state - # declare subblocks and connections here +class CustomUartConnector(Block): + def __init__(self) -> None: + super().__init__() + self.gnd = self.Port(Ground(), [Common]) + self.pwr = self.Port(VoltageSink(), [Power]) + self.uart = self.Port(UartPort()) + + self.conn = self.Block(PassiveConnector(length=4)).connected( + { + "1": self.gnd, + "2": self.pwr, + "3": self.uart.tx, + "4": self.uart.rx, + } + ) ``` -These are properties of Blocks: -- The Block type hierarchy defines allowed refinements -- `@abstract_block` decorates a block as abstract, which will error on netlisting - -These can be called inside `__init__(...)`: -- `self.Parameter(ParameterType(optional_value))`: declare parameters, optionally with a value -- `self.Port(PortType(...))`: declare ports - - Optional arguments: `tags=[ImplicitTags], optional=False` - - `self.Export(self.subblock.port)`: export a subblock's port -- `@init_in_parent` decorator is needed if `__init__(...)` takes Parameter arguments and must generate constraints in the parent Block - -These can be called inside `contents()`: -- `self.Block(BlockType(...))`: declare sub-blocks - - Also allowed inside `__init__(...)`, to allow the use of `Export`s -- `self.constrain(...)`: constrain some `BoolExpr` (which can be an inline expression, eg `self.param1 == self.param2`) to be true -- `self.connect(self.subblock1.port, self.subblock2.port, ...)`: connect own ports and/or subblock's ports - - Naming is optional. -- `with self.implicit_connect(...) as imp:`: open an implicit connection scope - - Implicit connection arguments of the form `ImplicitConnect(connect_to_port, [MatchingTags])` - - `imp.Block(BlockType(...))`: similar to `self.Block(...)` but implicitly connects ports with matching tags -- `self.chain(self.Block(BlockType(...)), self.Block(BlockType(...)), ...)`: chain-connect between blocks, in `contents` - - Return of `self.chain` can be unpacked into a tuple of chained blocks, and the chain object (itself). - Naming of the chain object is optional. - - Elements are chained from left (outputs) to right (inputs) - - The first argument to chain may be a port or block with an `InOut` or `Output`-tagged port. - - Middle elements must be a block with an `InOut`-tagged port, or `Input`- and `Output`-tagged ports. - - The last argument to chain may be a port or block with an `InOut` or `Input`-tageed port. -- Assign names to components by assigning the object to a `self` variable: - - `self.subblock_name = self.Block(BlockType(...))` - - `(self.subblock_name1, self.subblock_name2, ...), self.chain_name = self.chain(...)` - -### Generators -Generators allow some Python code to run that has access to the solved values of some parameters. -TODO - write this section pending generator refactoring, in the meantime see the port array section of the getting started tutorial. - - -### Footprint -FootprintBlock is a block that is associated with a PCB footprint. - -All primitives that can be called inside `Block`'s `__init__(...)` can be called inside `__init__(...)` - -These can be called inside `contents()`: -- `self.footprint(refdes='R', footprint='Resistor_SMD:R_0603_1608Metric', pinning={...})`: associates a footprint with this block - - Pinning argument format: `{'pin_name': self.port, ...}`: associates footprint pins with ports or subports - - Optional arguments: `mfr='Manufacturer A', part='Part Number', value='1kOhm', datasheet='www.example.net'` - - -## Port and Link Libraries - -### Single-wire Ports -- `VoltageLink`: voltage rail - - `VoltageSource(voltage_out, current_limits)`: voltage source - - `VoltageSink(voltage_limits, current_draw)`: voltage sink (power input) -- `DigitalLink`: low-speed (up to ~100 MHz) digital signals, modeling voltage limits and input / output thresholds - - `DigitalSource(voltage_out, current_limits, output_thresholds)`: digital output-only pin - - `output_thresholds` is the range of (maximum low output, minimum high output) - - `DigitalSink(voltage_limits, current_draw, input_thresholds)`: digital input-only pin - - `input_thresholds` is the range of (maximum low input, minimum high input) - - `DigitalBidir(...)`: digital bidirectional (eg, GPIO) pin - - Has all arguments of `DigitalSource` and `DigitalSink` -- `AnalogLink`: analog signal that models input and output impedance - - `AnalogSource(voltage_out, current_limits, impedance)`: analog output - - `AnalogSink(voltage_limits, current_draw, impedance)`: analog signal input -- `PassiveLink`: connected copper that contains no additional data - - `Passive`: single wire port that contains no additional data, but can be adapted to other types (eg, with `.as_voltage_source(...)`). - Useful for low-level elements (eg, resistors) that can be used in several ways in higher-level constructs (eg, pull-up resistor for digital applications). - -### Bundle Ports -- `I2cLink`: I2C net, consisting of `.scl` and `.sda` Digital sub-ports. - - `I2CMaster(model)`: I2C master port - - `model`: DigitalBidir model for both SCL and SDA sub-ports - - `I2CSlave(model)`: I2C slave port -- `SpiLink`: SPI net, consisting of `.sck`, `.miso`, and `.mosi` Digital sub-ports. CS must be handled separately. - - `SpiMaster(model, frequency)`: SPI master port - - `frequency`: range of allowable frequencies, generally including zero - - `SpiSlave(model, frequency)`: SPI slave port -- `UartLink`: UART net, consisting of `.tx` and `.rx` Digital sub-ports in a crossover point-to-point connection. - - `UartPort(model)`: UART port -- `UsbLink`: USB data net, consisting of `.dp` (D+) and `.dm` (D-) Digital sub-ports in a point-to-point connection. - - `UsbHostPort`: USB host - - `UsbDevicePort`: USB device - - `UsbPassivePort`: other components (eg, TVS diode) on the USB line -- `CanLogicLink`: CAN logic-level (TXD/RXD) net, consisting of `.txd` and `.rxd` Digital sub-ports in a point-to-point connection. - - `CanControllerPort(model)`: CAN controller-side port - - `CanTransceiverPort(model)`: CAN transceiver-side port -- `CanDiffLink`: CAN differential (CANH/CANL) net, consisting of `.canh` and `.canl` Digital sub-ports in a bus connection. - - `CanDiffPort(model)`: CAN node port -- `SwdLink`: SWD programming net, consisting of `.swdio`, `.swclk`, `.swo`, and `.reset` Digital sub-ports in a point-to-point connection. - - `SwdHostPort(model)`: SWD host-side (programmer) port - - `SwdTargetPort(model)`: SWD target-side (DUT) port -- `CrystalLink`: crystal net, consisting of `.xi` and `.xo` sub-ports in a point-to-point connection. - - `CrystalDriver(frequency_limits, voltage_out)`: driver-side port - - `CrystalPort(frequency)`: crystal-side port, indicating the frequency of the crystal - - -## Block Libraries -The IDE's library tab provides a categorized list of available library blocks. -Many blocks also have a short descriptive docstring. - - -## Advanced Core Primitives -These are core primitives needed to model new ports and links - -### Ports -Ports can have parameters and may be connected to each other via a Link. - -Skeleton structure: -```python -class MyPort(Port[MyPortLinkType]): - link_type = MyPortLinkType # required - bridge_type = MyPortBridgeType # optional, if a bridge is needed - - def __init__(self) -> None: - super().__init__() # essential to call the superclass method beforehand to initialize state - # declare elements like parameters here -``` +- Custom connectors are implemented as a `Block` with ports representing its IOs. +- `self.port_name = self.Port(...)` defines a port on the block. +- Ports must be typed, the `Passive` port type is not automatically connectable to typed single-wire ports like `Ground` or `VoltageSink` without explicit adapters. +- Ports take electrical modeling parameters (like voltage and current limits) as parameters, empty parameter generally means an ideal port. +- `PassiveConnector` is an abstract class for connectors with a parameterizable number of passive-typed pins, including 2.54mm headers, FPCs, and more. +- `PassiveConnector.connected(...)` automatically adapts typed ports to the connector's Passive ports. -These are properties of Ports: -- The Port type hierarchy currently is not used. However, inheritance may still be useful for code re-use / de-duplication. +### Sub-boards and Connector Pairs -These can be called inside `__init__(...)`: -- `__init__(...)` may take arguments, and no decorators (as with Block) are needed -- `self.Parameter(ParameterType(optional_value))`: declare parameters, optionally with a value +```python +class LedSubboard(SubboardBlock): + def __init__(self) -> None: + super().__init__() -### Bundles -Bundles are a special type of Port that is made up of constituent sub-Ports. + self.led = self.Block(IndicatorLed()) + self.gnd = self.Export(self.led.gnd, [Common]) + self.signal = self.Export(self.led.signal, [Input]) -Skeleton structure: -```python -class MyBundle(Bundle): - link_type = MyBundleLinkType - bridge_type = MyBundleBridgeType # optional, if a bridge is needed - - def __init__(self) -> None: - super().__init__() # essential to call the superclass method beforehand to initialize state - # declare elements like parameters here + self.conn = self.Block(Fpc050SocketTabPair(2), external=True) + self.export_tap(self.gnd.net, self.conn.pins.request("1")) + self.export_tap(self.io.net, self.conn.pins.request("2")) ``` -In addition to the primitives that can be called inside `Port`'s `__init__(...)`, these can be called inside `Bundle`'s `__init__(...)`: -- `self.Port(PortType(...))`: declare bundle sub-port +- Subboards are `Block`s that define a subcircuit that is its own board (generates a separate netlist). +- These are defined `Block`s that have their subcircuits inside and exported ports crossing the physical board boundary. +- These use a `SubboardConnectorPair` block (like `Fpc050SocketTabPair`) to define the physical connector pair. + - `SubboardConnectorPair` are similar to `PassiveConnector`, with `Passive` typed ports. + - Typed ports (like `Ground` or `VoltageSink`) internally contain a `Passive` `net` which can be attached to the connector's `Passive`ports. + - `self.export_tap` behaves similar to `self.connect`, but attaches the inner port to the outer port without propagating parameter values (non-physical attachment). + Conceptually, the connector taps onto (or hangs off) the parameter-propagating Export connection. -### Links -Links define propagation rules for connected Ports. -Links are structured the same as Blocks, with similar primitives (see the Block documentation for details): -```python -class MyPortLink(Link): - def __init__(self) -> None: - super().__init__() # essential to call the superclass method beforehand to initialize state - # declare ports here - - def contents(self) -> None: - super().contents() # essential to call the superclass method beforehand to initialize state - # declare constraints and internal connections here -``` +### Overriding Values / "Waiving" ERCs + +- Some of the electrical modeling may have overly strict limits or overly broad operating parameters resulting in compiler errors from ERC failures, use refinements to override their values. +- Values can be inspected via: + - CLI compiler error messages for values failing constraints, + - the IDE, + - or, the .json generated during compilation which contains the entire compiled / solved design. -These are properties of Links: -- Each Port can have one type of associated link. -- The Link type hierarchy currently is not used. However, inheritance may still be useful for code re-use / de-duplication. -- Extend `CircuitLink` instead of `Link` to copper-connect all ports. - -These can be called inside `__init__()`: -- `__init__()` cannot have arguments, since links are always inferred -- `self.Parameter(ParameterType(optional_value))` -- `self.Port(PortType(...))` (without tags, but can have optional) - -These can be called inside `contents()`: -- `self.connect(self.port1.subport, self.port2.subport, ...)`: for Bundle ports, connect sub-ports and infer inner link - - Naming is optional. -- `self.constrain(...)` - -### Bridges -Bridges are a special type of `Block` that adapts from a Link-facing (inner, `self.inner_link`) port to a Block edge (outer, `self.outer_port`) port. -Extend `CircuitPortBridge` instead of `PortBridge` to copper-connect all ports. - -In `__init__()` (may not take arguments), declare these two required ports. -In `contents()`, add constraints as needed. - -### Adapters -PortAdapters are a special type of `Block` that adapts / converts from a source (`self.src`) port to a destination (`self.dst`) port. -Extend `CircuitPortAdapter` instead of `PortAdapter` to copper-connect all ports. - -In `__init__(...)` (may take arguments, must decorate with `@init_in_parent` if arguments), declare these two required ports. -In `contents()`, add constraints as needed. diff --git a/reference_library.md b/reference_library.md new file mode 100644 index 000000000..c821269b6 --- /dev/null +++ b/reference_library.md @@ -0,0 +1,223 @@ +# Quick Reference, Library Construction + +A short reference specifically for building subcircuit / part library blocks. + +New? Consider reading through the [getting started guide](getting-started.md), including the subsequent sections on building library blocks. + +Also see the [top-level board design reference](reference.md). + + +## Dragons be Ahead + +The library design experience is much less polished and more intricate than the top-level board design experience. + + +## Parameters +- `BoolExpr`: boolean (true / false) variable + - Supports standard boolean operations +- `FloatExpr`: numeric variable + - Suppers standard numeric operations +- `RangeExpr`: range (interval) variable + - Supports standard numeric operations (multiplication and division are undefined), some set operations (`.within(other)`, `.contains(other)`, `.intersect(other)`), and get operations (`.lower()`, `.upper()`) +- `StringExpr`: string (text) variable + - Supports equality operations only + +## Blocks +Blocks represent a subcircuit (or hierarchical schematic sheet), and consist of boundary ports and internal subblocks and connections (links) between ports on those subblocks. + +Skeleton structure: +```python +class MyBlock(Block): + def __init__(self) -> None: + super().__init__() # essential to call the superclass method beforehand to initialize state + # declare ports here, and subblocks whose ports are exported + + def contents(self) -> None: + super().contents() # essential to call the superclass method beforehand to initialize state + # declare subblocks and connections here +``` + +These are properties of Blocks: +- The Block type hierarchy defines allowed refinements +- `@abstract_block` decorates a block as abstract, which will error on netlisting + +These can be called inside `__init__(...)`: +- `self.Parameter(ParameterType(optional_value))`: declare parameters, optionally with a value +- `self.Port(PortType(...))`: declare ports + - Optional arguments: `tags=[ImplicitTags], optional=False` + - `self.Export(self.subblock.port)`: export a subblock's port +- `@init_in_parent` decorator is needed if `__init__(...)` takes Parameter arguments and must generate constraints in the parent Block + +These can be called inside `contents()`: +- `self.Block(BlockType(...))`: declare sub-blocks + - Also allowed inside `__init__(...)`, to allow the use of `Export`s +- `self.constrain(...)`: constrain some `BoolExpr` (which can be an inline expression, eg `self.param1 == self.param2`) to be true +- `self.connect(self.subblock1.port, self.subblock2.port, ...)`: connect own ports and/or subblock's ports + - Naming is optional. +- `with self.implicit_connect(...) as imp:`: open an implicit connection scope + - Implicit connection arguments of the form `ImplicitConnect(connect_to_port, [MatchingTags])` + - `imp.Block(BlockType(...))`: similar to `self.Block(...)` but implicitly connects ports with matching tags +- `self.chain(self.Block(BlockType(...)), self.Block(BlockType(...)), ...)`: chain-connect between blocks, in `contents` + - Return of `self.chain` can be unpacked into a tuple of chained blocks, and the chain object (itself). + Naming of the chain object is optional. + - Elements are chained from left (outputs) to right (inputs) + - The first argument to chain may be a port or block with an `InOut` or `Output`-tagged port. + - Middle elements must be a block with an `InOut`-tagged port, or `Input`- and `Output`-tagged ports. + - The last argument to chain may be a port or block with an `InOut` or `Input`-tageed port. +- Assign names to components by assigning the object to a `self` variable: + - `self.subblock_name = self.Block(BlockType(...))` + - `(self.subblock_name1, self.subblock_name2, ...), self.chain_name = self.chain(...)` + +### Generators +Generators allow some Python code to run that has access to the solved values of some parameters. +TODO - write this section pending generator refactoring, in the meantime see the port array section of the getting started tutorial. + + +### Footprint +FootprintBlock is a block that is associated with a PCB footprint. + +All primitives that can be called inside `Block`'s `__init__(...)` can be called inside `__init__(...)` + +These can be called inside `contents()`: +- `self.footprint(refdes='R', footprint='Resistor_SMD:R_0603_1608Metric', pinning={...})`: associates a footprint with this block + - Pinning argument format: `{'pin_name': self.port, ...}`: associates footprint pins with ports or subports + - Optional arguments: `mfr='Manufacturer A', part='Part Number', value='1kOhm', datasheet='www.example.net'` + + +## Port and Link Libraries + +### Single-wire Ports +- `VoltageLink`: voltage rail + - `VoltageSource(voltage_out, current_limits)`: voltage source + - `VoltageSink(voltage_limits, current_draw)`: voltage sink (power input) +- `DigitalLink`: low-speed (up to ~100 MHz) digital signals, modeling voltage limits and input / output thresholds + - `DigitalSource(voltage_out, current_limits, output_thresholds)`: digital output-only pin + - `output_thresholds` is the range of (maximum low output, minimum high output) + - `DigitalSink(voltage_limits, current_draw, input_thresholds)`: digital input-only pin + - `input_thresholds` is the range of (maximum low input, minimum high input) + - `DigitalBidir(...)`: digital bidirectional (eg, GPIO) pin + - Has all arguments of `DigitalSource` and `DigitalSink` +- `AnalogLink`: analog signal that models input and output impedance + - `AnalogSource(voltage_out, current_limits, impedance)`: analog output + - `AnalogSink(voltage_limits, current_draw, impedance)`: analog signal input +- `PassiveLink`: connected copper that contains no additional data + - `Passive`: single wire port that contains no additional data, but can be adapted to other types (eg, with `.as_voltage_source(...)`). + Useful for low-level elements (eg, resistors) that can be used in several ways in higher-level constructs (eg, pull-up resistor for digital applications). + +### Bundle Ports +- `I2cLink`: I2C net, consisting of `.scl` and `.sda` Digital sub-ports. + - `I2CMaster(model)`: I2C master port + - `model`: DigitalBidir model for both SCL and SDA sub-ports + - `I2CSlave(model)`: I2C slave port +- `SpiLink`: SPI net, consisting of `.sck`, `.miso`, and `.mosi` Digital sub-ports. CS must be handled separately. + - `SpiMaster(model, frequency)`: SPI master port + - `frequency`: range of allowable frequencies, generally including zero + - `SpiSlave(model, frequency)`: SPI slave port +- `UartLink`: UART net, consisting of `.tx` and `.rx` Digital sub-ports in a crossover point-to-point connection. + - `UartPort(model)`: UART port +- `UsbLink`: USB data net, consisting of `.dp` (D+) and `.dm` (D-) Digital sub-ports in a point-to-point connection. + - `UsbHostPort`: USB host + - `UsbDevicePort`: USB device + - `UsbPassivePort`: other components (eg, TVS diode) on the USB line +- `CanLogicLink`: CAN logic-level (TXD/RXD) net, consisting of `.txd` and `.rxd` Digital sub-ports in a point-to-point connection. + - `CanControllerPort(model)`: CAN controller-side port + - `CanTransceiverPort(model)`: CAN transceiver-side port +- `CanDiffLink`: CAN differential (CANH/CANL) net, consisting of `.canh` and `.canl` Digital sub-ports in a bus connection. + - `CanDiffPort(model)`: CAN node port +- `SwdLink`: SWD programming net, consisting of `.swdio`, `.swclk`, `.swo`, and `.reset` Digital sub-ports in a point-to-point connection. + - `SwdHostPort(model)`: SWD host-side (programmer) port + - `SwdTargetPort(model)`: SWD target-side (DUT) port +- `CrystalLink`: crystal net, consisting of `.xi` and `.xo` sub-ports in a point-to-point connection. + - `CrystalDriver(frequency_limits, voltage_out)`: driver-side port + - `CrystalPort(frequency)`: crystal-side port, indicating the frequency of the crystal + + +## Block Libraries +The IDE's library tab provides a categorized list of available library blocks. +Many blocks also have a short descriptive docstring. + + +## Advanced Core Primitives +These are core primitives needed to model new ports and links + +### Ports +Ports can have parameters and may be connected to each other via a Link. + +Skeleton structure: +```python +class MyPort(Port[MyPortLinkType]): + link_type = MyPortLinkType # required + bridge_type = MyPortBridgeType # optional, if a bridge is needed + + def __init__(self) -> None: + super().__init__() # essential to call the superclass method beforehand to initialize state + # declare elements like parameters here +``` + +These are properties of Ports: +- The Port type hierarchy currently is not used. However, inheritance may still be useful for code re-use / de-duplication. + +These can be called inside `__init__(...)`: +- `__init__(...)` may take arguments, and no decorators (as with Block) are needed +- `self.Parameter(ParameterType(optional_value))`: declare parameters, optionally with a value + +### Bundles +Bundles are a special type of Port that is made up of constituent sub-Ports. + +Skeleton structure: +```python +class MyBundle(Bundle): + link_type = MyBundleLinkType + bridge_type = MyBundleBridgeType # optional, if a bridge is needed + + def __init__(self) -> None: + super().__init__() # essential to call the superclass method beforehand to initialize state + # declare elements like parameters here +``` + +In addition to the primitives that can be called inside `Port`'s `__init__(...)`, these can be called inside `Bundle`'s `__init__(...)`: +- `self.Port(PortType(...))`: declare bundle sub-port + +### Links +Links define propagation rules for connected Ports. + +Links are structured the same as Blocks, with similar primitives (see the Block documentation for details): +```python +class MyPortLink(Link): + def __init__(self) -> None: + super().__init__() # essential to call the superclass method beforehand to initialize state + # declare ports here + + def contents(self) -> None: + super().contents() # essential to call the superclass method beforehand to initialize state + # declare constraints and internal connections here +``` + +These are properties of Links: +- Each Port can have one type of associated link. +- The Link type hierarchy currently is not used. However, inheritance may still be useful for code re-use / de-duplication. +- Extend `CircuitLink` instead of `Link` to copper-connect all ports. + +These can be called inside `__init__()`: +- `__init__()` cannot have arguments, since links are always inferred +- `self.Parameter(ParameterType(optional_value))` +- `self.Port(PortType(...))` (without tags, but can have optional) + +These can be called inside `contents()`: +- `self.connect(self.port1.subport, self.port2.subport, ...)`: for Bundle ports, connect sub-ports and infer inner link + - Naming is optional. +- `self.constrain(...)` + +### Bridges +Bridges are a special type of `Block` that adapts from a Link-facing (inner, `self.inner_link`) port to a Block edge (outer, `self.outer_port`) port. +Extend `CircuitPortBridge` instead of `PortBridge` to copper-connect all ports. + +In `__init__()` (may not take arguments), declare these two required ports. +In `contents()`, add constraints as needed. + +### Adapters +PortAdapters are a special type of `Block` that adapts / converts from a source (`self.src`) port to a destination (`self.dst`) port. +Extend `CircuitPortAdapter` instead of `PortAdapter` to copper-connect all ports. + +In `__init__(...)` (may take arguments, must decorate with `@init_in_parent` if arguments), declare these two required ports. +In `contents()`, add constraints as needed. From 90c0c9ce1016962a43480110f77423b14c744513 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 01:24:27 -0700 Subject: [PATCH 04/41] Update reference.md --- reference.md | 66 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 38 insertions(+), 28 deletions(-) diff --git a/reference.md b/reference.md index 20de0dad3..fe95176e8 100644 --- a/reference.md +++ b/reference.md @@ -19,18 +19,18 @@ class MyBoard(SimpleBoardTop): self.led = self.Block(IndicatorLed()) self.connect(self.mcu.gpio.request("led"), self.led.signal) self.connect(self.mcu.gnd, self.led.gnd) - + self.sw = self.Block(DigitalSwitch()) + self.connect(self.mcu.gpio.request("sw"), self.sw.out) + self.connect(self.mcu.gnd, self.sw.gnd) + def refinements(self) -> Refinements: # refinements describe modifications across the design hierarchy return super().refinements() + Refinements( class_refinements=[ (IoController, Esp32c3), # replace all abstract IoController with Esp32c3 ], - instance_refinements=[ - (["mcu"], Esp32c3), # replace mcu with Esp32c3, redundant with the above class refinement - ], instance_values=[ - (["mcu", "pin_assigns"], ["led=3"]) # assign LED to footprint pin 3 + (["mcu", "pin_assigns"], ["led=3", "sw=6"]) # assign to footprint pin ], ) ``` @@ -41,11 +41,12 @@ class MyBoard(SimpleBoardTop): ### Block definition +Internal blocks are created using `self.Block(...)` and must be assigned a unique name (in `self`) for netlist stability. + ```python self.block_name = self.Block(BlockType(...)) ``` -- All blocks must have a unique name as a `self` variable (this preserves netlist stability for layout). - Some blocks may take arguments, see their `__init__` for details. - Builtin parts (like ICs) are in [the parts folder](edg/parts) and builtin circuits are in [the circuits folder](edg/circuits). - See [the examples](examples/) for common blocks and how they're used. @@ -54,36 +55,38 @@ self.block_name = self.Block(BlockType(...)) #### Range Arguments +Blocks commonly take arguments as a range-like type, typically a specification for an allowable range accounting for tolerance stackup. + ```python self.reg = self.Block(LinearRegulator(3.3 * Volt(tol=0.05))) ``` -- Blocks commonly take arguments as a range-like type, typically a specification for an allowable range accounting for tolerance stackup. - #### ElementDict +`ElementDict` creates an internal namespace, providing an unique name for elements in an array of blocks by attaching their index to the name. + ```python self.block_name = ElementDict[IndicatorLed]() for i in range(4): self.block_name[i] = self.Block(IndicatorLed()) ``` -- `ElementDict` provides an internal namespace for blocks, by index name. -- Use this to construct (and uniquely name) arrays of blocks. - ### Connections +`self.connect` connects ports on blocks, inferring the link type from the port types in the connection. + ```python self.connect(self.block1.port, self.block2.port, ...) ``` -- `self.connect` connects ports on blocks, inferring the link type from the port types in the connection. - `self.connect` returns a `Connection` object, which can be used in connections. - Optionally assign a name to the `Connection` by assigning to a `self` variable. #### Implicit Connection Blocks +`self.implicit_connect` creates a scope for implicit connections, typically for power and ground. + ```python with self.implicit_connect( ImplicitConnect(self.pwr, [Power]), @@ -92,34 +95,39 @@ with self.implicit_connect( self.block_name = imp.Block(BlockType(...)) ``` -- `self.implicit_connect` creates a scope for implicit connections, which automatically connects ports on instantiated blocks by matching on tags like `Power` and `Common`. -- This is typically used to implicitly connect power (`Power` tag) and ground (`Common` tag) ports. +- Port matching is done against the block's ports' tags like `Power` and `Common`. #### Chain Connections +`self.chain` connects ports (and ports on blocks) in a chain, from left to right. + ```python (self.led,), _ = self.chain(imp.Block(IndicatorSinkLed()), self.mcu.gpio.request("led")) ``` -- `self.chain` connects ports in a chain, from left to right. - Blocks in the chain are connected to: - their `Input` tagged port, for an incoming connection from the left, - their `Output` tagged port, for an outgoing connection to the right, - their `InOut` tagged port, for both incoming and outgoing connections (tapped connection). - This returns a tuple of `(blocks...), chain`. Blocks must be named, the chain object can be optionally named to name the interior nets. +- In the example above: + - The trailing comma in `(self.led, )` unpacks the single-element blocks tuple to name it. + - The `_` discards (does not name) the chain object. #### .connected(...) +Some (but far from all) blocks define a `.connected(...)` as a shorthand connection method, see each class's API for details. + ```python self.tp_gnd = self.Block(GroundTestPoint()).connected(self.gnd) ``` -- Some (but far from all) blocks define a `.connected(...)` as a shorthand connection method, see each class's API for details. - ### Refinements +Refinements allow specifying, at the top level, modification across the design hierarchy. + ```python def refinements(self) -> Refinements: return super().refinements() + Refinements( @@ -138,7 +146,6 @@ def refinements(self) -> Refinements: ) ``` -- Refinements allow specifying, at the top level, modification across the design hierarchy. - `class_refinements` replaces all instances of a block type with a subclass. - `instance_refinements` replaces a specific instance of a block with a subclass. The instance is specified as a path, as a list of block names from the root. @@ -151,7 +158,7 @@ def refinements(self) -> Refinements: - Some blocks, particularly discrete components like `Resistor`s and `Fet`s, are implemented as automatic selection from a parts table. - These are some common top-level refinements: - - Class refinement`(SelectorArea, ["footprint_area"], Range.from_lower(1.5))`: require a minimum footprint courtyard area in mm² + - Class refinement `(SelectorArea, ["footprint_area"], Range.from_lower(1.5))`: require a minimum footprint courtyard area in mm² - These are common minimum areas for passives: 01005=0.72, 0201=0.98, 0402=1.74, 0603=4.32, 0805=6.38, 1206=10.21. - Instance refinement `(["part_table_block", "excluded_parts"], ["1N2127"])`: exclude parts from selection, e.g., if they're out-of-stock. - Instance refinement `(["part_table_block", "part"], "1N2127")`: require a particular part. @@ -160,12 +167,13 @@ def refinements(self) -> Refinements: ### IoController +`IoController` is an abstract class for any programmable IO controller, typically microcontrollers, but also including FPGAs. + ```python self.mcu = imp.Block(IoController()) self.connect(self.mcu.gpio.request("led"), self.led.signal) ``` -- `IoController` is an abstract class for any programmable IO controller, typically microcontrollers, but also including FPGAs. - `IoController`s have a `gnd` and `pwr` input power ports, and `gpio`, `adc`, `spi`, `i2c`, `uart`, and `usb` Vector IO ports which elements can be requested from. - Not all `IoController`s support all IO types, see each class's API for details. - The `request(...)` name is used in the `pin_assigns` refinement, with each entry specified as either `led=3` (by footprint pin number) or `led=GPIO4` (by IO name, see each class's API for details). @@ -173,6 +181,8 @@ self.connect(self.mcu.gpio.request("led"), self.led.signal) ### Mixins +Mixins are a way to require additional functionality (or ports) on an abstract block, they restrict refinements to concrete classes that implement the mixin. + ```python # require additional ports defined by a mixin self.connect(self.can.controller, self.mcu.with_mixin(IoControllerCan()).can.request("can")) @@ -181,8 +191,6 @@ self.connect(self.can.controller, self.mcu.with_mixin(IoControllerCan()).can.req self.mcu.with_mixin(IoControllerWifi()) ``` -- Mixins are a way to require additional functionality on an abstract block, they restrict refinements to concrete classes that implement the mixin. -- Mixins can optionally define ports and parameters. - IoController has these mixins: - defining IO ports: `IoControllerDac`, `IoControllerI2cTarget`, `IoControllerSpiPeripheral`, `IoControllerTouchDriver`, `IoControllerCan`, `IoControllerUsbCc`, `IoControllerI2s`, `IoControllerDvp8` - connectivity requirements only: `IoControllerWifi`, `IoControllerBluetooth`, `IoControllerBle` @@ -191,6 +199,8 @@ self.mcu.with_mixin(IoControllerWifi()) ### Connector Blocks +Custom connectors are implemented as a `Block` with ports representing its IOs. + ```python class CustomUartConnector(Block): def __init__(self) -> None: @@ -209,7 +219,6 @@ class CustomUartConnector(Block): ) ``` -- Custom connectors are implemented as a `Block` with ports representing its IOs. - `self.port_name = self.Port(...)` defines a port on the block. - Ports must be typed, the `Passive` port type is not automatically connectable to typed single-wire ports like `Ground` or `VoltageSink` without explicit adapters. - Ports take electrical modeling parameters (like voltage and current limits) as parameters, empty parameter generally means an ideal port. @@ -218,6 +227,8 @@ class CustomUartConnector(Block): ### Sub-boards and Connector Pairs +Subboards are `Block`s that define a subcircuit that is its own board (generates a separate netlist). + ```python class LedSubboard(SubboardBlock): def __init__(self) -> None: @@ -229,23 +240,22 @@ class LedSubboard(SubboardBlock): self.conn = self.Block(Fpc050SocketTabPair(2), external=True) self.export_tap(self.gnd.net, self.conn.pins.request("1")) - self.export_tap(self.io.net, self.conn.pins.request("2")) + self.export_tap(self.signal.net, self.conn.pins.request("2")) ``` -- Subboards are `Block`s that define a subcircuit that is its own board (generates a separate netlist). - These are defined `Block`s that have their subcircuits inside and exported ports crossing the physical board boundary. - These use a `SubboardConnectorPair` block (like `Fpc050SocketTabPair`) to define the physical connector pair. - `SubboardConnectorPair` are similar to `PassiveConnector`, with `Passive` typed ports. - - Typed ports (like `Ground` or `VoltageSink`) internally contain a `Passive` `net` which can be attached to the connector's `Passive`ports. + - Typed ports (like `Ground` or `VoltageSink`) internally contain a `Passive` `net` which can be attached to the connector's `Passive` ports. - `self.export_tap` behaves similar to `self.connect`, but attaches the inner port to the outer port without propagating parameter values (non-physical attachment). Conceptually, the connector taps onto (or hangs off) the parameter-propagating Export connection. ### Overriding Values / "Waiving" ERCs -- Some of the electrical modeling may have overly strict limits or overly broad operating parameters resulting in compiler errors from ERC failures, use refinements to override their values. +Some of the electrical modeling may have overly strict limits or overly broad operating parameters resulting in compiler errors from ERC failures, use refinements to override their values. + - Values can be inspected via: - CLI compiler error messages for values failing constraints, - the IDE, - or, the .json generated during compilation which contains the entire compiled / solved design. - From 195d1c853f0e48392b195d45fa1de181c5c76e05 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 01:29:53 -0700 Subject: [PATCH 05/41] Update reference.md --- reference.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/reference.md b/reference.md index fe95176e8..54b05aa7c 100644 --- a/reference.md +++ b/reference.md @@ -14,7 +14,7 @@ Also see the [reference for building subcircuit / part library blocks](reference class MyBoard(SimpleBoardTop): def contents(self) -> None: # declare subblocks and connections here - super().contents() # required to call this superclass method + super().contents() # required to call this superclass method first self.mcu = self.Block(IoController()) self.led = self.Block(IndicatorLed()) self.connect(self.mcu.gpio.request("led"), self.led.signal) @@ -30,7 +30,7 @@ class MyBoard(SimpleBoardTop): (IoController, Esp32c3), # replace all abstract IoController with Esp32c3 ], instance_values=[ - (["mcu", "pin_assigns"], ["led=3", "sw=6"]) # assign to footprint pin + (["mcu", "pin_assigns"], ["led=3", "sw=6"]) # assign to footprint pins 3 and 6 ], ) ``` @@ -95,7 +95,7 @@ with self.implicit_connect( self.block_name = imp.Block(BlockType(...)) ``` -- Port matching is done against the block's ports' tags like `Power` and `Common`. +- Port matching is done against the block's ports' tags using tag objects `Power` and `Common`. #### Chain Connections @@ -109,7 +109,7 @@ with self.implicit_connect( - their `Input` tagged port, for an incoming connection from the left, - their `Output` tagged port, for an outgoing connection to the right, - their `InOut` tagged port, for both incoming and outgoing connections (tapped connection). -- This returns a tuple of `(blocks...), chain`. +- This returns a nested tuple of `((blocks...), chain)`. Blocks must be named, the chain object can be optionally named to name the interior nets. - In the example above: - The trailing comma in `(self.led, )` unpacks the single-element blocks tuple to name it. From 8138204c7fc35a347689099887c4ef6e9764be8e Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 01:36:54 -0700 Subject: [PATCH 06/41] Update reference.md --- reference.md | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/reference.md b/reference.md index 54b05aa7c..2928c1b22 100644 --- a/reference.md +++ b/reference.md @@ -105,15 +105,15 @@ with self.implicit_connect( (self.led,), _ = self.chain(imp.Block(IndicatorSinkLed()), self.mcu.gpio.request("led")) ``` -- Blocks in the chain are connected to: - - their `Input` tagged port, for an incoming connection from the left, - - their `Output` tagged port, for an outgoing connection to the right, - - their `InOut` tagged port, for both incoming and outgoing connections (tapped connection). -- This returns a nested tuple of `((blocks...), chain)`. +- `self.chain` returns a nested tuple of `((blocks...), chain)`. Blocks must be named, the chain object can be optionally named to name the interior nets. - In the example above: - The trailing comma in `(self.led, )` unpacks the single-element blocks tuple to name it. - The `_` discards (does not name) the chain object. +- Blocks in the chain are connected to: + - their `Input` tagged port, for an incoming connection from the left, + - their `Output` tagged port, for an outgoing connection to the right, + - their `InOut` tagged port, for both incoming and outgoing connections (tapped connection). #### .connected(...) @@ -158,8 +158,8 @@ def refinements(self) -> Refinements: - Some blocks, particularly discrete components like `Resistor`s and `Fet`s, are implemented as automatic selection from a parts table. - These are some common top-level refinements: - - Class refinement `(SelectorArea, ["footprint_area"], Range.from_lower(1.5))`: require a minimum footprint courtyard area in mm² - - These are common minimum areas for passives: 01005=0.72, 0201=0.98, 0402=1.74, 0603=4.32, 0805=6.38, 1206=10.21. + - Class refinement `(SelectorArea, ["footprint_area"], Range.from_lower(1.5))`: require a minimum footprint courtyard area, in mm² + - Common minimum areas for passives, in mm²: 01005=0.72, 0201=0.98, 0402=1.74, 0603=4.32, 0805=6.38, 1206=10.21. - Instance refinement `(["part_table_block", "excluded_parts"], ["1N2127"])`: exclude parts from selection, e.g., if they're out-of-stock. - Instance refinement `(["part_table_block", "part"], "1N2127")`: require a particular part. - Instance refinement `(["part_table_block", "footprint_spec"], "Diode_SMD:D_SMA")`: require a particular footprint. @@ -220,7 +220,7 @@ class CustomUartConnector(Block): ``` - `self.port_name = self.Port(...)` defines a port on the block. -- Ports must be typed, the `Passive` port type is not automatically connectable to typed single-wire ports like `Ground` or `VoltageSink` without explicit adapters. +- Ports must be typed, the `Passive` port type is not automatically connectable to typed single-wire ports like `Ground` or `VoltageSink` without adapters. - Ports take electrical modeling parameters (like voltage and current limits) as parameters, empty parameter generally means an ideal port. - `PassiveConnector` is an abstract class for connectors with a parameterizable number of passive-typed pins, including 2.54mm headers, FPCs, and more. - `PassiveConnector.connected(...)` automatically adapts typed ports to the connector's Passive ports. From 2999e745e8e501a3e8567cbe25f06f059a1a29e9 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 01:43:03 -0700 Subject: [PATCH 07/41] Update reference.md --- reference.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/reference.md b/reference.md index 2928c1b22..468a77669 100644 --- a/reference.md +++ b/reference.md @@ -255,6 +255,12 @@ class LedSubboard(SubboardBlock): Some of the electrical modeling may have overly strict limits or overly broad operating parameters resulting in compiler errors from ERC failures, use refinements to override their values. +```python +class_refinements=[ + (Neopixel, ["pwr", "voltage_limits"], Range(3.0, 5.5)), # mostly works fine at 3.3v +] +``` + - Values can be inspected via: - CLI compiler error messages for values failing constraints, - the IDE, From 4b560e5ae22f7acea382236b8b1260d5486ff8ca Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 01:43:38 -0700 Subject: [PATCH 08/41] Update Neopixel.py --- edg/abstract_parts/Neopixel.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/edg/abstract_parts/Neopixel.py b/edg/abstract_parts/Neopixel.py index 93377b6e4..4d85ed899 100644 --- a/edg/abstract_parts/Neopixel.py +++ b/edg/abstract_parts/Neopixel.py @@ -1,3 +1,5 @@ +from deprecated import deprecated + from ..electronics_interfaces import * @@ -8,7 +10,11 @@ class Neopixel(Light, Block): def __init__(self) -> None: super().__init__() self.pwr = self.Port(VoltageSink.empty(), [Power]) - self.vdd = self.pwr # deprecated alias self.gnd = self.Port(Ground.empty(), [Common]) self.din = self.Port(DigitalSink.empty(), [Input]) self.dout = self.Port(DigitalSource.empty(), optional=True) + + @property + @deprecated(f"use pwr") + def vdd(self) -> VoltageSink: + return self.pwr From f8b5a288f911cbcfc4527f7fdac20004da1b027a Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 01:51:32 -0700 Subject: [PATCH 09/41] Update reference.md --- reference.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reference.md b/reference.md index 468a77669..d17d188b3 100644 --- a/reference.md +++ b/reference.md @@ -82,6 +82,8 @@ self.connect(self.block1.port, self.block2.port, ...) - `self.connect` returns a `Connection` object, which can be used in connections. - Optionally assign a name to the `Connection` by assigning to a `self` variable. +- Connections must be between ports of compatible type. + Typed ports (like `Ground` or `VoltageSink`) are distinct from `Passive` ports and not connectable without adapters. #### Implicit Connection Blocks From 93876bbe157909be0d5e999485aa88a11759cf94 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 01:59:59 -0700 Subject: [PATCH 10/41] Update reference.md --- reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.md b/reference.md index d17d188b3..91aee72e2 100644 --- a/reference.md +++ b/reference.md @@ -1,6 +1,6 @@ # Quick Reference -A short reference for writing HDL code. +A short reference for writing HDL for (top-level) board designs. New? Consider reading through the [getting started guide](getting-started.md). From 0acd8451849563fa6cd4d3500b10ba4eca16bd23 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 02:03:52 -0700 Subject: [PATCH 11/41] Update test_ble_joystick.py --- examples/test_ble_joystick.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/examples/test_ble_joystick.py b/examples/test_ble_joystick.py index 50f73dd29..4939c79dd 100644 --- a/examples/test_ble_joystick.py +++ b/examples/test_ble_joystick.py @@ -254,15 +254,6 @@ def refinements(self) -> Refinements: (["btns", "ioe"], Ch32v003), (["reg_3v3"], Xc6206p), (["bumper_sw", "package"], SmtSwitchRa), - # TODO debug why class refinements not working - (["btns", "sw[0]", "package"], SmtSwitch), - (["btns", "sw[1]", "package"], SmtSwitch), - (["btns", "sw[2]", "package"], SmtSwitch), - (["btns", "sw[3]", "package"], SmtSwitch), - (["btns", "sw[4]", "package"], SmtSwitch), - (["btns", "sw[5]", "package"], SmtSwitch), - (["btns", "sw[6]", "package"], SmtSwitch), - (["btns", "sw[7]", "package"], SmtSwitch), ], instance_values=[ (["refdes_prefix"], "J"), # unique refdes for panelization @@ -310,7 +301,7 @@ def refinements(self) -> Refinements: (TagConnect, TagConnectNonLegged), (PassiveConnector, PinHeader2mm), (Neopixel, Ws2812c_2020), - (TactileSwitch, SmtSwitch), + (Switch, SmtSwitch), ], class_values=[ (ProtectionZenerDiode, ["diode", "footprint_spec"], "Diode_SMD:D_SOD-123"), From 48be327d04507178b98f5ae5f7c112da32d23a34 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 11:20:19 -0700 Subject: [PATCH 12/41] streamlining --- getting-started.md | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/getting-started.md b/getting-started.md index 39c719b20..3c6903c83 100644 --- a/getting-started.md +++ b/getting-started.md @@ -1,38 +1,44 @@ # Getting Started Tutorial +Introductory tutorial and example starter project, building towards a basic mechanical keyboard macropad. + + ## Core concepts The core abstraction is the hierarchical block diagram, which we will explain using an example design of a microcontroller driving an LED. In conventional schematic tools, such a design could be a flat schematic, consisting of the microcontroller module, LED, and resistor: ![Blinky Hierarchy Block Diagram](docs/blinky_model_flat.png) -Many modern tools have the concept of hierarchy blocks, where a block could be a subcircuit: +Modern tools have the concept of hierarchy blocks, where a block could be a subcircuit: ![Blinky Hierarchy Block Diagram](docs/blinky_model_hierarchy1.png) In the example above, the LED-resistor subcircuit is contained within a block, which can be manipulated as a unit, and exposes ports (circles on the diagram) while encapsulating internal pins. -(note: in mainstream schematic tools with this feature, the subcircuit is usually presented in its own sheet, instead of having its contents displayed in the block) Generalizing this model, components are blocks too, and component pins are also block ports: ![Blinky Hierarchy Block Diagram](docs/blinky_model_hierarchy2.png) -The main concepts our model extends on top of the simple hierarchy blocks above are **parameters**, **links**, and **generators**. +The main concepts our model extends on top of the simple hierarchy blocks above are **parameters** and **generators**. **Parameters** are variables that can be attached to blocks and ports. -For example, a digital IO, like `digital[0]` in the example above, would have parameters like input voltage tolerance, output voltage range, and logic thresholds. -This allows for a more powerful design correctness check (think ERC++), and provides a foundation for generators. +For example, a digital IO, like the `mcu`'s `digital[0]` in the example above, would have parameters like voltage limits, output voltage range, and logic thresholds. +This allows for automated design correctness check of basic datasheet parameters (think ERC++) and provides a foundation for generators. **Generators** allow a block's internal contents to be constructed by code, possibly based on parameters on it and its ports. For example, the `IndicatorLed` block automatically sizes the resistor based on the input voltage on the `sig` pin, and the DC-DC converter block automatically sizes inductors and capacitors based on the target output voltage and current. -Finally, in the internal model (mainly relevant for compiler writers and library builders), the connections between ports expand into **links** which defines how parameters propagate between those ports and any constraints on them. -Continuing the digital IO example, the link would check the output thresholds against the input thresholds, and provide the worst-case voltage levels given all connected drivers. -These could be viewed as a block-like object (diamonds on the diagram) instead of direct wire connections: +
Under the hood: from connections to links + +While the user-facing HDL design model is connections between ports, the internal model expands these connections into **links**. +Links are a block-like construct (diamonds in the diagram) that define how parameters propagate between ports and constraints on them. ![Blinky Hierarchy Block Diagram](docs/blinky_model_full.png) -> In the user-facing HDL design model, links are inferred based on the types of connected ports and not explicit. -> Being aware of links can be useful for debugging, but this is mainly relevant for compiler writers and library builders. +Continuing the digital IO example, the link checks the output thresholds against the input thresholds and calculate the full range of voltage levels given all connected drivers. +These could be viewed as a block-like object (diamonds on the diagram) instead of direct wire connections: + +All links are fully defined in the same HDL code, and you can inspect the link definitions of included port types to see how they work and what they check. +You can also write custom links and ports, though this will be unnecessary for most users. -We'll put these concepts into practice in the rest of this tutorial by building a variation of the blinky example above, then defining a custom part. +
### Setup @@ -41,7 +47,6 @@ Instructions for setting up the IDE and compiler are in the [setup document](set ### Reference Document While this getting started guide is meant to be self-contained, you may also find the [reference document](reference.md) helpful, especially as you build designs outside this tutorial. -The reference document includes a short overview of all the core primitives and common library elements. ### Hardware Description Language (HDL) @@ -815,7 +820,7 @@ Continue to [the next part of the tutorial](getting_started_schimport.md) on def ### Additional Resources If you want to some more complex examples of boards designed in this HDL, check out: -- [LED Matrix](examples/test_ledmatrix.py): a charlieplexed LED matrix. - Ignore the implementation of the charlieplexing LED matrix library block for now, just look at the top-leve design. +- [Keyboard](examples/test_keyboard.py): the fabbed-out version of this example, with a few more features and different choices of parts. +- [LED Matrix](examples/test_ledmatrix.py): a charlieplexed LED matrix, using a parameterized charlieplexing LED array generator. +- [Seven Segment Clock](examples/test_seven_segment.py): an IoT (ESP32S3) seven-segment LED clock, using individually-addressable RGBs for each segment. - [Simon Game](examples/test_simon.py): an implementation of the Simon electronic game, that uses 12v dome buttons and includes the needed power conversion circuitry. -- [CANdapter](examples/test_can_adapter.py): an USB to isolated CAN adapter, with a bunch of onboard LEDs and an LCD display. From 95be90432adae9fa5823f33fe38132e0df80adf2 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 13:55:15 -0700 Subject: [PATCH 13/41] wip --- getting-started.md | 887 +++++++++------------------- getting_started_hierarchy_layout.md | 0 getting_started_library.md | 4 + reference.md | 2 +- 4 files changed, 291 insertions(+), 602 deletions(-) create mode 100644 getting_started_hierarchy_layout.md diff --git a/getting-started.md b/getting-started.md index 3c6903c83..1aee70578 100644 --- a/getting-started.md +++ b/getting-started.md @@ -44,6 +44,8 @@ You can also write custom links and ports, though this will be unnecessary for m ### Setup Instructions for setting up the IDE and compiler are in the [setup document](setup.md). +The rest of this tutorial requires that you have this `edg` package (available on `pip`) installed. + ### Reference Document While this getting started guide is meant to be self-contained, you may also find the [reference document](reference.md) helpful, especially as you build designs outside this tutorial. @@ -53,25 +55,16 @@ While this getting started guide is meant to be self-contained, you may also fin To support user-defined computation of parameters and generator blocks, the design system is implemented as a _hardware description language_ (HDL). That is, blocks are "placed" or instantiated, and their ports are connected, through lines in code instead of GUI actions in a graphical schematic. -There are a couple of basic operations, which you'll get to try in the tutorial: -- **Block Definition**: blocks are defined as Python classes which extend (subclass, including indirectly) `Block`. -- **Block Instantiation**: creates a sub-block in the current block - - For example, `self.led = self.Block(IndicatorLed())` instantiates an `IndicatorLed` block and names it `led` in the current block -- **Port Instantiation**: creates an exterior port in the current block, used for building library blocks. - - For example, `self.vdd = self.Port(VoltageSink(voltage_limits=(2.3, 5.5)*Volt, current_draw=(0, 15)*uAmp))` instantiates a port of type `VoltageSink` (voltage input) with defined voltage limits and current draw ranges, and names it `vdd`. - - Ports are not allowed on top-level blocks. -- **Connect**: connects two (or more) ports. - - For example, `self.connect(self.mcu.gnd, self.led.gnd)` connects the `gnd` ports on `mcu` and `led` - - -### Graphical Editor and Integrated Development Environment (IDE) -While an HDL is needed to support parameter computation and programmatic construction, some operations (like building a top-level design with an LED connected to a microcontroller) may not require the full power provided by an HDL and may be more intuitive or familiar within a graphical environment. -However, because this design makes use of generator blocks (the LED), and because blocks may also take parameters (such as the target output voltage of a DC-DC converter), the HDL is still the primary design input. -To help with these more basic operations and to support those more familiar with a graphical schematic capture flow, an IDE helps bridge the graphical schematic-like and HDL code representations. Specifically, it: -- provides a block diagram visualization of the design +### Optional Integrated Development Environment (IDE) with Graphical Editor +We have also built a basic IDE (as a PyCharm plugin) that provides some basic graphical integrations for working with HDL. +Specifically, it: +- generates a block diagram visualization of the design - allows inspection of solved / computed parameters in the design -- generates and inserts HDL code from schematic editor-like actions +- provides schematic-like graphical edit actions to insert HDL + +The graphical edit actions have significant limitations (and probably bugs / unhandled edge cases) compared to the full HDL and is best suited for simple designs or as a learning tool. +**Consider it more of a tech demonstrator and proof-of-concept** but do give it a try. ![Annotated IDE screen](docs/ide/overview.png) @@ -83,13 +76,12 @@ The IDE has these major components: - The preview box on the right shows more information on the selected library block, including docstring (if available), instantiation parameters, and block diagram preview. - **Compiler / Run Console**: shows the compilation log, including any errors and prints from Python as HDL runs. -The rest of this tutorial will focus on the HDL, but will also describe how the equivalent code could be generated by GUI actions. -**As you go through the tutorial, you can write the code shown in the code blocks or follow the graphical actions described immediately afterward.** -However, you can't do both (since they would duplicate the same results), but you can try the graphical actions if you remove the code. +The rest of this tutorial focuses on the HDL, but equivalent graphical edit actions (where possible) are described in expandable boxes. +**As you go through the tutorial, you can write the code shown in the code blocks or follow the graphical actions.** ## A top-level design: Blinky -_In this example, we will create a circuit consisting of a LED and switch connected to a microcontroller._ +_In this example, we will create a basic LED controlled by a microcontroller._ Start by creating a `blinky.py`, and filling it with this skeleton code: @@ -107,37 +99,36 @@ if __name__ == "__main__": compile_board_inplace(BlinkyExample) ``` -> If using the IDE, `blinky.py` must be within the project directory. -> Make sure you've set up the project according to the [setup document](setup.md). -> -> If using the command line, `blinky.py` can be created anywhere. - - `from edg import *` brings in the base classes for circuit construction, like `SimpleBoardTop`. -- `class BlinkyExample` contains the (top-level) circuit you're going to build, and it extends the top-level hierarchical block base class `SimpleBoardTop`. +- `class BlinkyExample` contains the (top-level) circuit you're going to build, and it extends the top-level block base class `SimpleBoardTop`. It's empty for now, but we'll fill it in the next section. - - `SimpleBoardTop` has definitions which make this tutorial easier but which may not be desirable in a production environment, in which case you should use `BoardTop`. - Currently, this is just ignoring the frequency specification for inductor, since that data isn't available in the parts table. + - `SimpleBoardTop` provides some default component mappings and relaxes some strict constraints that do not matter for maker-type boards. - `compile_board_inplace(...)` invokes the circuit generator given the top-level design (`BlinkyExample`). This is the starting point that allows the file to run as a Python script, and you can treat it as magic. Try building the example now. -**If using the IDE**: look for the run icon ![run icon](docs/ide/ide_run_button.png) in the gutter (with the line numbers) next to `class BlinkyExample`: -![run in IDE](docs/ide/ide_gutter_run.png) -1. Click it. +**If using the command line**: +1. Run `python blinky.py`. + If all worked, this should create a folder `BlinkyExample` with a netlist `BlinkyExample.net` inside. + +**If using the IDE**: +1. Click the run icon ![run icon](docs/ide/ide_run_button.png) in the gutter (with the line numbers) next to `class BlinkyExample`: + + ![run in IDE](docs/ide/ide_gutter_run.png) + _Make sure that you're using the run icon associated with `class BlinkyExample`, not the file, and not `if __name__ == "__main__"`._ 2. Then from the menu, click the Run option. ![run menu](docs/ide/ide_run_blinky_menu.png) > **Tip**: Next time, you can rebuild the design by re-running the last selected run configuration with hotkey **Shift+F10** (Windows) or **Ctrl+R** (MacOS). - > **Note on re-compiling behavior**: The IDE only re-compiles block classes when its source (or the source of superclasses) has changed, but this does not catch all functional changes. - > If changes aren't recompiling, try making a change to the class code. - > Alternatively, you can clear all compiled blocks through main menu > Tools > Empty Block Cache. - > - > In particular, these changes may not trigger a recompile: + > **Recompilation caching behavior**: the IDE only re-compiles block classes when it detects changes in its source (including some dependencies), but this misses edge cases including: + > > - Any changes outside the class, even if the code is called by the class. > - Changes to supporting files (such as part tables and imported schematics), even if they are referenced in the class. - > - Changes to `__init__` do not re-compile instantiating classes, even if default values have been updated. + > - Changes to default values of `__init__` arguments. + > + > You can clear all compiled blocks through main menu > Tools > Empty Block Cache. 3. The design should build, and you should get a run log that looks something like: ``` Starting compilation of blinky.BlinkyExample @@ -147,25 +138,31 @@ Try building the example now. ``` 4. Some options (like where the netlist is generated into) can be modified via the run options at the top right: ![run menu](docs/ide/ide_run_config.png) -
If not using the IDE - -Run `python blinky.py` from the command line. -If all worked, this should create a folder `BlinkyExample` with a netlist `BlinkyExample.net` inside. -
- -
Resolving common errors - -- If you get an error along the lines of `ModuleNotFoundError: No module named 'deprecated'` or `ModuleNotFoundError: No module named 'google'`, this is because the Python dependencies haven't been installed. -See the [setup document](setup.md) for instructions on installing dependencies. -
### Creating the microcontroller and LED -For this simple example, we connect an LED to a STM32F103 microcontroller, and have everything powered by a USB type-C receptacle. +For this simple example, we connect an LED to a self-powered Xiao Rp2040 microcontroller dev board. + +**Make these changes** to the `contents` method: +```diff + def contents(self) -> None: + super().contents() +- # your implementation here ++ self.mcu = self.Block(Xiao_Rp2040()) ++ self.led = self.Block(IndicatorLed()) +``` + +
Alternatively, with IDE graphical edit actions Let's start by instantiating the USB type-C receptacle through graphical operations in the IDE. -1. In the Library Browser, search for the block (here, `UsbCReceptable`) using the Filter textbox: +1. In the Library Browser, search for the block (here, `Xiao_Rp2040`) using the Filter textbox: ![Library filtering by USB](docs/ide/ide_library_usbc.png) + + > The library icons have these meanings: + > - ![Folder](docs/intellij_icons/AllIcons.Nodes.Folder.svg) (category): this "block" is actually a category organizer and cannot be instantiated. + > - ![Abstract Type](docs/intellij_icons/AllIcons.Hierarchy.Subtypes.dark.svg) (abstract type): this block is an abstract type. + > Abstract blocks can be instantiated and will be discussed more later. + 2. Double-click the library entry. This will insert the code to instantiate the block as a _live template_, code with template fields you can fill in: ![Live template example](docs/ide/ide_livetemplate_usbc.png) @@ -187,27 +184,14 @@ Let's start by instantiating the USB type-C receptacle through graphical operati > - Press [Esc] to cancel the template, ending the editing but leaving the code in place. > Canceling a blank template deletes the inserted code. -> `self.Block(...)` creates a sub-block in `self` (the current hierarchy block being defined). -> It must be assigned to an instance variable (in this case, `mcu`), which is used as the name sub-block. - -> The library icons have these meanings: -> - ![Folder](docs/intellij_icons/AllIcons.Nodes.Folder.svg) (category): this "block" is actually a category organizer and should not be instantiated. -> - ![Abstract Type](docs/intellij_icons/AllIcons.Hierarchy.Subtypes.dark.svg) (abstract type): this block is an abstract type. -> Abstract blocks will be discussed more later. -> - Most will not have an icon, which means that they're none of the above. These blocks can be instantiated. +**Repeat for the LED** (`IndicatorLed`, named `led`). -**Repeat for the microcontroller** (`Stm32f103_48`, named `mcu`) **and LED** (`IndicatorLed`, named `led`). +
-If all was done correctly, your changes to the skeleton code might look like: -```diff - super().contents() -- # your implementation here -+ self.usb = self.Block(UsbCReceptacle()) -+ self.mcu = self.Block(Stm32f103_48()) -+ self.led = self.Block(IndicatorLed()) -``` +`self.Block(...)` creates a sub-block in `self` (the current hierarchy block being defined). +It must be assigned to an instance variable (in this case, `mcu`), which is used as the name sub-block. -If you're using the IDE, once you recompile the block diagram should look like: +If using the IDE: the compiled block diagram should look like: ![Blink diagram with blocks only](docs/ide/ide_blinky_blocks.png) With something on your screen now, you can zoom in and out of the visualization using the mousewheel, or pan by clicking and dragging. @@ -217,607 +201,308 @@ We'll fix that next. ### Connecting blocks Blocks alone aren't very interesting, and they must be connected to be useful. -First, we need to connect the power and ground between the devices, which we can also do with graphical operations in the IDE: -1. Double click any of the ground ports (say, `usb.gnd`). +First, we need to connect the power and ground between the devices. + +**Make these changes** to the `contents` method: +```diff + def contents() -> None: + super().contents() + self.mcu = self.Block(Xiao_Rp2040()) + self.led = self.Block(IndicatorLed()) ++ self.connect(self.usb.pwr, self.mcu.pwr) ++ self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) +``` + +
Alternatively, with IDE graphical edit actions + +1. Double click any of the ground ports (say, `mcu.gnd`). This starts a connection operation, which dims out the ports that cannot be connected: ![Connection beginning](docs/ide/ide_connect_usbc_start.png) -2. Select (single click) on all the other ground ports to be connected (here, `mcu.gnd` and `led.gnd`): +2. Select (single click) on all the other ground ports to be connected (here, just `led.gnd`): ![Connection with ports](docs/ide/ide_connect_usbc_all.png) - - The order in which you select additional ports determines the order of the ports in the generated code. -3. Double-click anywhere (within a block) to insert the connections as a live template. +3. Double-click anywhere (within a block) to complete and insert the connections as a live template. ![Connection live template](docs/ide/ide_livetemplate_gnd_connect.png) - > - You can double-click on a port to simultaneously select that port and insert the connection. - > - You can cancel a connect operation by pressing [Esc] while the block diagram visualizer is selected. + > - Double-click on a port to simultaneously select that port and complete and insert the connection. + > - Alternatively, cancel a connect operation by pressing [Esc] while the block diagram visualizer is selected. 4. The name template field is optional, leave it blank and [Tab] past it. - - Like the block instantiation, you can move the live template with [Alt+Click]. + > - Like the block instantiation, you can move the live template with [Alt+Click]. 5. Once you commit the live template, the connection will appear in the block diagram visualizer. -> `self.connect(...)` connects all the argument ports together. -> Connections are strongly typed based on the port types: the system will try to infer a _link_ based on the argument port types and count. +
+ +`self.connect(...)` connects all the argument ports together. +Connections are strongly typed based on the port types: the system will try to infer a _link_ based on the argument port types and count. + +If using the IDE: the compiled block diagram should look like: +![Block diagrams with power connections](docs/ide/ide_blinky_connectpower.png) -**Repeat for the power line** (connect `usb.pwr` to `mcu.pwr`). +Then, we need to connect the LED to a GPIO on the microcontroller. +Make these changes to the `contents` method: -If all was done correctly, your changes to the skeleton code might look like: ```diff - self.usb = self.Block(UsbCReceptacle()) - self.mcu = self.Block(Stm32f103_48()) - self.led = self.Block(IndicatorLed()) -+ self.connect(self.usb.pwr, self.mcu.pwr) -+ self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + def contents() -> None: + super().contents() + self.mcu = self.Block(Xiao_Rp2040()) + self.led = self.Block(IndicatorLed()) + self.connect(self.usb.pwr, self.mcu.pwr) + self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) ++ self.connect(self.mcu.gpio.request('led'), self.led.signal) ``` -> `self.connect(...)` connects all the argument ports together. -> Connections are strongly typed based on the port types: the system will try to infer a _link_ based on the argument port types and count. +
Alternatively, with IDE graphical edit actions -If you're using the IDE, once you recompile the block diagram should look like: -![Block diagrams with power connections](docs/ide/ide_blinky_connectpower.png) +1. **Repeat the previous connect process**, but with `mcu.gpio` to `led.signal`. + The microcontroller GPIO port ![port array symbol](docs/ide/ide_portarray.png) looks different as it is a dynamically sized port array. + Connections into it ![port array symbol](docs/ide/ide_portarray_slice_min.png) `request(...)` a new element from the array. +2. Give the GPIO pin an (optional) name `led` by modifying the generated code: + ```diff + - self.connect(self.mcu.gpio.request(), self.led.signal) + + self.connect(self.mcu.gpio.request('led'), self.led.signal) + ``` + + Port array element naming has no graphical operation. -Then, we need to connect the LED to a GPIO on the microcontroller, so **repeat the connect process** (connect `mcu.gpio` to `led.signal`). +
-If all was done correctly, your changes to the skeleton code might look like: -```diff - self.connect(self.usb.pwr, self.mcu.pwr) - self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) -+ self.connect(self.mcu.gpio.request(), self.led.signal) -``` +Microcontroller GPIOs (and other IOs like SPI and UART) are _port arrays_, which are dynamically sized. +Here, we `request(...)` a new GPIO from the GPIO port array, then connect it to the LED. +`request(...)` takes an optional name parameter, the meaning of which depends on the block. -Give the GPIO pin an (optional) name `led` by modifying the generated code: -```diff -- self.connect(self.mcu.gpio.request(), self.led.signal) -+ self.connect(self.mcu.gpio.request('led'), self.led.signal) -``` +By default, these connections are arbitrarily assigned to microcontroller pins. +However pin assignments can also be manually specified (using this name parameter) to simplify board layout - this will be covered at the end of this tutorial. + +Port arrays can be connected as a unit, which also propagates the length, though this isn't yet supported with graphical operations. + +Port arrays behave differently when viewed externally (as we're doing here) and internally (for library builders). +Internal usage of port arrays will be covered later in the library building section. -> Microcontroller GPIOs (and other IOs like SPI and UART) are ![port array symbol](docs/ide/ide_portarray.png) _port arrays_, which are dynamically sized. -> Here, we ![port array symbol](docs/ide/ide_portarray_slice_min.png) `request(...)` a new GPIO from the GPIO port array, then connect it to the LED. -> `request(...)` takes an optional name parameter, the meaning of which depends on the block. -> -> By default, these connections are arbitrarily assigned to microcontroller pins. -> However pin assignments can also be manually specified (using this name parameter) to simplify board layout - this will be covered at the end of this tutorial. -> -> Port arrays can be connected as a unit, which also propagates the length, though this isn't yet supported with graphical operations. -> -> Port arrays behave differently when viewed externally (as we're doing here) and internally (for library builders). -> Internal usage of port arrays will be covered later in the library building section. - -Recompiling in the IDE yields this block diagram: +This should now compile without errors. + +If using the IDE: the compiled block diagram should look like: ![Fully connected block diagram](docs/ide/ide_blinky_connect.png) ->
-> At this point, your HDL might look like... -> -> ```python -> class BlinkyExample(SimpleBoardTop): -> def contents(self) -> None: -> super().contents() -> self.usb = self.Block(UsbCReceptacle()) -> self.mcu = self.Block(Stm32f103_48()) -> self.led = self.Block(IndicatorLed()) -> self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) -> self.connect(self.usb.pwr, self.mcu.pwr) -> self.connect(self.mcu.gpio.request('led'), self.led.signal) -> ``` ->
- - -## Fixing Blinky -_In this section, we will explore and fix the remaining compiler errors to get to a clean design._ - -While the design is now structurally complete, we still have errors in the form of failed assertions. -Assertions are checks on the electronics model, in this case it's detecting a voltage incompatibility between the USB's 5v out and the STM32's 3.3v tolerant power inputs. - -If you're in the IDE, errors will show up in the compilation log and in the errors tab: -![Errors tab with errors](docs/ide/ide_blinky_errors.png) -You can also inspect the details of the power connection by mousing over it: -![Inspection of the power lines with voltages and limits](docs/ide/ide_blinky_inspect.png) - -### Adding a Voltage Regulator -To run the STM32 within its rated voltage limits, we'll need a voltage regulator to lower the 5v from USB to the common 3.3v power expected by modern devices. - -**Repeat the add block flow** with a `VoltageRegulator` block and name it `reg`. -Unlike the prior blocks, we actually need to specify a target output voltage here: use `3.3*Volt(tol=0.05)` for 3.3V ± 5%. -If using live templates, you can write it into the `output_voltage` template field. -**Place this between the USB connector and the microcontroller** (you can use Alt+click to move the template position, while it's active). -![Regulator live template](docs/ide/ide_livetemplate_reg.png) - -> The `VoltageRegulator` block is parameterized - configured by additional data specified as constructor arguments. -> -> Many blocks in the library are parameterized, allowing them to be used in a wide range of situations. -> See each block's definition or documentation for what those parameters mean. - -**Repeat the connect flow** to connect `reg.gnd` to the existing ground net. -If using graphical operations, you can start by double-clicking on any port you want to connect. -**Try merging the new connect into the prior ground connect statement by re-positioning (Alt+click) the template into the prior ground connect**. -![Connection live template](docs/ide/ide_livetemplate_gnd_append.png) - -You'll also need to splice the regulator into the power connection between the USB and the microcontroller. -Since graphical operations don't support connection delete, you'll have to **delete the power connection in the code, then recompile**: -```diff - self.usb = self.Block(UsbCReceptacle()) - self.reg = self.Block(VoltageRegulator(3.3*Volt(tol=0.05))) - self.mcu = self.Block(Stm32f103_48()) - self.led = self.Block(IndicatorLed()) - self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) -- self.connect(self.usb.pwr, self.mcu.pwr) - self.connect(self.mcu.gpio.request('led'), self.led.signal) -``` -From here, you can **repeat the connect flow** to connect the regulator input and output. +## To KiCad Layout + +If you have KiCad installed, you can import the design into the layout editor. _KiCad 6.0+ is required, the netlist format is not compatible with 5.x or lower!_ + +In the KiCad standalone PCB Editor (layout tool), go to File > Import > Netlist..., and open the netlist file generated. +KiCad will produce an initial placement that roughly clusters components according to their hierarchical grouping: +![Blinky layout with default placement](docs/blinky_kicad.png) + +The generated netlist preserves the design hierarchy. +This works with KiCad 10+'s native design blocks feature (which is somewhat heavyweight) as well as the [Sublayout plugin](https://github.com/ducky64/sublayout) (more lightweight and limited). +Once you complete this keyboard example, check out the [hierarchical layout tutorial](getting_started_hierarchy_layout.md) for hierarchical layout replication. +Some plugins (like Replicate Layout) require a schematic for equivalence validation and cannot be used with this flow. + +By default, each footprint's value field is set to the block's full path name, on the F.Fab layer. +This can be useful during placement to understand the function of each component. + +As you continue to modify HDL, the unique component identifiers (tstamps) are stable and allows you to update a partial layout with a new netlist. +**Unique component identifiers are generated from Block names, so if HDL names change those footprints will not update.** + + +## Adding a Switch Matrix Generator +__Now, we'll add a 3x2 switch matrix with just a few lines of code, this is where generators really shine!__ -When all is done, your changes to the skeleton code might look like: +**Make these changes** to the `contents` method: ```diff - self.usb = self.Block(UsbCReceptacle()) -+ self.reg = self.Block(VoltageRegulator(3.3*Volt(tol=0.05))) - self.mcu = self.Block(Stm32f103_48()) - self.led = self.Block(IndicatorLed()) -- self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) -- self.connect(self.usb.pwr, self.mcu.pwr) -+ self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd, self.reg.gnd) -+ self.connect(self.usb.pwr, self.reg.pwr_in) -+ self.connect(self.reg.pwr_out, self.mcu.pwr) - self.connect(self.mcu.gpio.request('led'), self.led.signal) + def contents() -> None: + super().contents() + self.mcu = self.Block(Xiao_Rp2040()) + self.led = self.Block(IndicatorLed()) + self.connect(self.usb.pwr, self.mcu.pwr) + self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) + ++ self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) ++ self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) ++ self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) ``` -If you try recompiling it, it will give you an error because `VoltageRegulator` is an _abstract block_ (it does not have an implementation) and was automatically substituted with an ideal model (which does not have a circuit implementation, but allows compilation to continue). -Abstract blocks are useful for two reasons: -1. It allows your design to be more general and allows you to defer implementation choices until later. - This is more relevant for library builders, where you may want to give the system designer the choice of, for example, whether to use a surface-mount or through-hole resistor. -2. It can help preserve design intent more precisely and keep HDL readable. - For example, saying that we want a voltage regulator can be more intuitive than directly instantiating a TPS561201 block. +
Alternatively, with IDE graphical edit actions + +TODO Write Me + +
+ +`SwitchMatrix` is a generator block that takes the number of columns (width) and rows (height) as parameters and generates the switch matrix (including diodes for mutli-key detection). +For the keyboard enthusiasts, this generates COL2ROW circuits. + +`SwitchMatrix` has two ports, `cols` and `rows`, both of which are port arrays. +Unlike microcontrollers, where the array is defined by its incoming connections (are elements sinks), `SwitchMatrix` port arrays are internally defined (are elements sources) based on the parameters. -Unlike in software, we can instantiate abstract blocks here, but they won't actually place down a useful circuit. -We can _refine_ those abstract blocks to give them a _concrete_ subclass by **adding a refinements block in the top-level design class**. +Port arrays can be connected to other arrays, forming a parallel connection. +Here, we connect `cols` (and `rows`) to the microcontroller, using `request_vector(...)` to request a new GPIOs the size of the incoming connection. + +If we load the netlist into KiCad, we get this: +![Default SwitchMatrix Layout](docs/switchmatrix_kicad.png) + + +## Abstract Parts and Refinements +_Tactile switches are probably not what we want for a mechanical keyboard, so we'll fix that here._ + +Internally, SwitchMatrix uses the abstract `Switch` block, and `SimpleBoardTop` defines a global default mapping `Switch` to a 5.1mm tactile switch. + +**Make these changes** to the `contents` method: ```diff class BlinkyExample(SimpleBoardTop): def contents(self) -> None: ... - + ++ @override + def refinements(self) -> Refinements: -+ return super().refinements() + Refinements( -+ instance_refinements=[ -+ (['reg'], Tps561201), -+ ]) ++ return super().refinements() + Refinements( ++ class_refinements=[ ++ (Switch, KailhSocket), ++ ], ++ ) ``` -> `BoardTop` defines default refinements for some common types, such has choosing surface-mount components for `Resistor` and `Capacitor`. -> You can override these with a refinement in your HDL, for example choosing `AxialResistor`. - -> If using the IDE, refinements can be done through the library browser. -> 1. Select (single click) on the block you want to refine. -> 2. In the Library Browser, search for the class you want to refine into. -> If you don't know, you can filter by the abstract type and see what options are under it. -> 3. Right-click the subclass in the Library Browser, and click "Refine instance...". -> - Refine instance only affects the single selected block. -> - Refine class affects all classes of the selected block. -> This may be useful, for example, if you wanted to do a design-wide replacement of all generic resistors with a specific type. -> 4. The corresponding refinement block should be inserted, or if it already exists, a new refinement entry will be added. - -Recompiling in the IDE yields this block diagram and no errors: -![Blinky with buck converter block diagram](docs/ide/ide_blinky_buck.png) - ->
-> At this point, your HDL might look like... -> -> ```python -> class BlinkyExample(SimpleBoardTop): -> def contents(self) -> None: -> super().contents() -> self.usb = self.Block(UsbCReceptacle()) -> self.reg = self.Block(VoltageRegulator(3.3*Volt(tol=0.05))) -> self.mcu = self.Block(Stm32f103_48()) -> self.led = self.Block(IndicatorLed()) -> self.connect(self.usb.gnd, self.reg.gnd, self.mcu.gnd, self.led.gnd) -> self.connect(self.usb.pwr, self.reg.pwr_in) -> self.connect(self.reg.pwr_out, self.mcu.pwr) -> self.connect(self.mcu.gpio.request('led'), self.led.signal) -> -> def refinements(self) -> Refinements: -> return super().refinements() + Refinements( -> instance_refinements=[ -> (['reg'], Tps561201), -> ]) -> ``` ->
- -### Deeper Inspection -Here, we were able to place down a buck converter - a non-trivial subcircuit - with just one line of code. -A major benefit of this HDL-based design flow is the design automation that is encapsulated in the libraries. -The library writer has done the hard work of figuring out how to size the capacitors and inductors, and wrapped it into this neat `VoltageRegulator` block. - -You may want to inspect the results. -In the IDE, you can hover over the output line and see that it is at 3.3v ±4.47%. -Why? -You can dig into the converter subcircuit by double-clicking on it: -![TPS561201 subcircuit](docs/ide/ide_buck_internal.png) - -The implementation uses a feedback voltage divider, and if you mouseover this it will show the generated ratio of 0.23. -The converter's output voltage reflects the actual expected output voltage, accounting for resistor tolerance and the chip's feedback reference tolerance. -![Buck converter input capacitor](docs/ide/ide_buck_fb.png) - -Similarly, mousing over the other components like the resistors and capacitors shows their details. - -To zoom out, double-click on the topmost block. - -## KiCad Import -If you have KiCad installed, you can import this full design into the layout editor. _KiCad 6.0+ is required, the netlist format is not compatible with 5.x or lower!_ - -In the KiCad PCB Editor (layout tool), go to File > Import > Netlist..., and open the netlist file generated. -KiCad will produce an initial placement that roughly clusters components according to their hierarchical grouping: -![Blinky layout with default placement](docs/blinky_kicad.png) +
Alternatively, with IDE graphical edit actions -The block hierarchy will appear to KiCad as a sheet hierarchy. -You can, for example, right click one of the footprints > Select > Items in Same Hierarchical Sheet, and it will select all footprints in that sub-block. - +1. **Navigate into the switch in the switch matrix hierarchy and select it**. + It is currently refined to a JlcSwitch, the tactile 5.1mm switch that is part of the JLC basic parts library. + ![Switch design hierarchy](docs/ide/ide_designhierarchy_switch.png) +2. **In the library, search for KailhSocket**, then right-click it and select "Refine class Switch to KailhSocket" + ![KailhSocket refinement menu](docs/ide/ide_refine_switch.png) -As you continue to write HDL, tstamps (an unique per-footprint ID used by KiCad to match netlist components to layout footprints) are stable and allows you to update a partial layout with a new netlist. -**tstamps are generated from Block names, so if HDL names change those footprints will not update.** +
+ +Refinements allow specifying, at the top level, modifications across the design hierarchy. +Here, we override the default Switch refinement to use a mechanical keyswitch socket. -When you're ready for production, you can toggle traditional refdes generation (R1, R2, instead of current hierarchical path). -While refdes generation is deterministic (the same design will produce the same refdes assignments), small changes to the design can significantly change refdes assignments. +If we load the netlist into KiCad, we get more reasonable components: +![Refined SwitchMatrix Layout](docs/switchmatrix_refined_kicad.png) +After finishing this tutorial, see the [hierarchical layout tutorial](getting_started_hierarchy_layout.md) for speeding up layout using hierarchical layout replication. -## Expanding Blinky -**_This section goes over some additional quality-of-life features that can make the HDL more elegant and powerful, but does not introduce any significantly new constructs._** +You could place and route this board now, get it fabbed, and it will (probably) work. +This design requires footprints from the Keyswitch KiCad Library, available in the KiCad Plugin and Content Manager. -_In this section, we will add a tactile switch and three more LEDs._ -### Adding a Switch -A tactile switch with a digital output can be instantiated as `DigitalSwitch()` which has an `out` port. -Using what you've learned above, instantiate a switch and connect it to the microcontroller. +## Towards a Discrete Microcontroller +_So far, we have used a microcontroller development board, which while convenient, may not be the best choice from a cost and size perspective. Here, we'll replace it with a discrete chip and supporting component._ -### Arraying LEDs -While you certainly can copy-paste the above LED instantiation 4 times, that's no fun given that we're in a programming language with `for` loops. +Because blocks encapsulate their subcircuits, using a discrete microcontroller is as easy as a development board from an HDL perspective. -**Replace your single LED instantiation and connections with**: +**Make these changes** to the design: ```diff - ... -- self.led = self.Block(IndicatorLed()) -- self.connect(self.usb.gnd, self.reg.gnd, self.mcu.gnd, self.led.gnd) -+ self.connect(self.usb.gnd, self.reg.gnd, self.mcu.gnd) - ... -- self.connect(self.mcu.gpio.request('led'), self.led.signal) - ... -+ self.led = ElementDict[IndicatorLed]() -+ for i in range(4): -+ self.led[i] = self.Block(IndicatorLed()) -+ self.connect(self.mcu.gpio.request(f'led{i}'), self.led[i].signal) -+ self.connect(self.usb.gnd, self.led[i].gnd) + class BlinkyExample(SimpleBoardTop): + def contents() -> None: + super().contents() +- self.mcu = self.Block(Xiao_Rp2040()) ++ self.mcu = self.Block(IoController()) + self.led = self.Block(IndicatorLed()) + self.connect(self.usb.pwr, self.mcu.pwr) + self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) + + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) + + @override + def refinements(self) -> Refinements: + return super().refinements() + Refinements( + class_refinements=[ ++ (IoController, Stm32f103_48), + (Switch, KailhSocket), + ], + ) ``` -> ElementDict creates a naming space that is an extension of the parent and is needed to give a unique, arrayed name for the LED being created. -> The square brackets provide the type parameter for the value type, which is necessary when using static analysis tools like mypy. - -> The IDE cannot produce code that programmatically generates hardware. -> In general, code offers you a lot more power than can be achieved through the GUI. -> -> However, the visualizer will run fine. - -Recompiling in the IDE yields this block diagram: -![Blinky with switch and LED array block diagram](docs/ide/ide_ledarray.png) - ->
-> At this point, your HDL might look like... -> -> ```python -> class BlinkyExample(SimpleBoardTop): -> def contents(self) -> None: -> super().contents() -> self.usb = self.Block(UsbCReceptacle()) -> self.reg = self.Block(VoltageRegulator(3.3*Volt(tol=0.05))) -> self.mcu = self.Block(Stm32f103_48()) -> self.connect(self.usb.gnd, self.reg.gnd, self.mcu.gnd) -> self.connect(self.usb.pwr, self.reg.pwr_in) -> self.connect(self.reg.pwr_out, self.mcu.pwr) -> -> self.sw = self.Block(DigitalSwitch()) -> self.connect(self.mcu.gpio.request('sw'), self.sw.out) -> self.connect(self.usb.gnd, self.sw.gnd) -> -> self.led = ElementDict[IndicatorLed]() -> for i in range(4): -> self.led[i] = self.Block(IndicatorLed()) -> self.connect(self.mcu.gpio.request(f'led{i}'), self.led[i].signal) -> self.connect(self.usb.gnd, self.led[i].gnd) -> -> def refinements(self) -> Refinements: -> return super().refinements() + Refinements( -> instance_refinements=[ -> (['reg'], Tps561201), -> ]) -> ``` ->
- - -## Syntactic sugar -_Syntactic sugar refers to syntax within programming languages that makes things more usable._ -_In this section, we clean up the prior example by consolidating some repetitive connections through implicit scopes._ - -> Similar to arraying LEDs, the IDE does not have any special support for generating these operations. -> However, the visualizer will continue to run fine. - -### Implicit Connections -Because some connections (like power and ground) are very common, the HDL provides the idea of an implicit connection scope to automatically make them when a block is instantiated. -The implicit scope defines the connections to make and the conditions for which ports to connect (through tags): +Refactoring and delete operations are not supported with graphical edit actions. +However, you can delete lines of code, then recompile, then insert new blocks and connections using the graphical edits flow. -```python -with self.implicit_connect( - ImplicitConnect(self.reg.pwr_out, [Power]), - ImplicitConnect(self.reg.gnd, [Common]), -) as imp: - # any blocks here instantiated with imp.Block(...) instead of self.Block(...) - # will have Power-tagged ports connected to self.reg.pwr_out - # and Common-tagged ports connected to self.reg.gnd -``` +Instead of directly replacing the microcontroller, we replace it with the `IoController` abstract block, which all microcontrollers implement. +Then, we specify refine that to a specific microcontroller, here the STM32F103. -> When blocks define ports, they can associate tags with them to specify implicit connectivity. -> To prevent errors, all ports with tags are required to be connected, either implicitly (as in this section) or explicitly (through `connect` statements). -> -> The most common tags are `Power` (for a general positive voltage rail) and `Common` (for ground). +If we recompile this now, it will give errors since the microcontroller has no power source. -In our example, we can get rid of the explicit power and ground connections. -Start by **adding an implicit scope** to tie Power-tagged ports to `self.reg.pwr_out` and Common- (ground) tagged ports to `self.reg.gnd`, and **move the microcontroller, switch, and LED into the implicit scope** +### Adding Supporting Components +We'll add in the USB type-C port that was previously part of the Xiao, and connect its power and data lines. +**Make these changes** to the `contents` method: ```diff - ... - self.reg = self.Block(VoltageRegulator(3.3*Volt(tol=0.05))) + class BlinkyExample(SimpleBoardTop): + def contents() -> None: + super().contents() + ++ self.usb = self.Block(UsbCReceptacle()) + + self.mcu = self.Block(IoController()) ++ self.connect(self.usb.gnd, self.mcu.gnd) ++ self.connect(self.usb.pwr, self.mcu.pwr) ++ self.connect(self.usb.usb, self.mcu.usb.request('usb)) + + self.led = self.Block(IndicatorLed()) + self.connect(self.usb.pwr, self.mcu.pwr) + self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) -+ with self.implicit_connect( -+ ImplicitConnect(self.reg.pwr_out, [Power]), -+ ImplicitConnect(self.reg.gnd, [Common]), -+ ) as imp: - self.mcu = self.Block(IoController()) - self.connect(self.usb.gnd, self.reg.gnd, self.mcu.gnd) - self.connect(self.usb.pwr, self.reg.pwr_in) - self.connect(self.reg.pwr_out, self.mcu.pwr) - - self.sw = self.Block(DigitalSwitch()) - self.connect(self.mcu.gpio.request('sw'), self.sw.out) - self.connect(self.usb.gnd, self.sw.gnd) - - self.led = ElementDict[IndicatorLed]() - for i in range(4): - self.led[i] = self.Block(IndicatorLed()) - self.connect(self.mcu.gpio.request(f'led{i}'), self.led[i].signal) - self.connect(self.usb.gnd, self.led[i].gnd) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) ``` -Inside an implicit connection block, only blocks instantiated with `imp.Block(...)` have implicit connections made. -**Replace the microcontroller, switch, and LED `self.Block(...)` instantiations with `imp.Block(...)` instantiations**, then **delete the redundant power and ground connections** (remember that the USB to regulator ground would need to be separated out): - +We will still get errors if we recompile, since USB provides 5v, while the STM32F103 is a 3.3v part. +We'll insert a simple linear regulator, a step-down voltage converter. +**Make these changes** to the `contents` method: ```diff - ... - self.reg = self.Block(VoltageRegulator(3.3*Volt(tol=0.05))) -+ self.connect(self.usb.gnd, self.reg.gnd) -+ self.connect(self.usb.pwr, self.reg.pwr_in) - with self.implicit_connect( - ImplicitConnect(self.reg.pwr_out, [Power]), - ImplicitConnect(self.reg.gnd, [Common]), - ) as imp: -- self.mcu = self.Block(IoController()) -+ self.mcu = imp.Block(IoController()) -- self.connect(self.usb.gnd, self.reg.gnd, self.mcu.gnd) -- self.connect(self.usb.pwr, self.reg.pwr_in) -- self.connect(self.reg.pwr_out, self.mcu.pwr) - -- self.sw = self.Block(DigitalSwitch()) -+ self.sw = imp.Block(DigitalSwitch()) - self.connect(self.mcu.gpio.request('sw'), self.sw.out) -- self.connect(self.usb.gnd, self.sw.gnd) - - self.led = ElementDict[IndicatorLed]() - for i in range(4): -- self.led[i] = self.Block(IndicatorLed()) -+ self.led[i] = imp.Block(IndicatorLed()) - self.connect(self.mcu.gpio.request(f'led{i}'), self.led[i].signal) -- self.connect(self.usb.gnd, self.led[i].gnd) + class BlinkyExample(SimpleBoardTop): + def contents() -> None: + super().contents() + + self.usb = self.Block(UsbCReceptacle()) + ++ self.reg = self.Block(LinearRegulator(3.3*Volt(tol=0.05))) ++ self.connect(self.usb.gnd, self.reg.gnd) ++ self.connect(self.usb.pwr, self.reg.pwr_in) + + self.mcu = self.Block(IoController()) + self.connect(self.usb.gnd, self.mcu.gnd) +- self.connect(self.usb.pwr, self.mcu.pwr) ++ self.connect(self.reg.pwr_out, self.mcu.pwr) + self.connect(self.usb.usb, self.mcu.usb.request('usb)) + + self.led = self.Block(IndicatorLed()) + self.connect(self.usb.pwr, self.mcu.pwr) + self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) + + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) ``` ->
-> At this point, your HDL might look like... -> -> ```python -> class BlinkyExample(SimpleBoardTop): -> def contents(self) -> None: -> super().contents() -> self.usb = self.Block(UsbCReceptacle()) -> self.reg = self.Block(VoltageRegulator(3.3*Volt(tol=0.05))) -> self.connect(self.usb.gnd, self.reg.gnd) -> self.connect(self.usb.pwr, self.reg.pwr_in) -> -> with self.implicit_connect( -> ImplicitConnect(self.reg.pwr_out, [Power]), -> ImplicitConnect(self.reg.gnd, [Common]), -> ) as imp: -> self.mcu = imp.Block(Stm32f103_48()) -> -> self.sw = imp.Block(DigitalSwitch()) -> self.connect(self.mcu.gpio.request('sw'), self.sw.out) -> -> self.led = ElementDict[IndicatorLed]() -> for i in range(4): -> self.led[i] = imp.Block(IndicatorLed()) -> self.connect(self.mcu.gpio.request(f'led{i}'), self.led[i].signal) -> -> def refinements(self) -> Refinements: -> return super().refinements() + Refinements( -> instance_refinements=[ -> (['reg'], Tps561201), -> ]) -> ``` ->
- -### Chain Connects -Another shorthand is for chained connections of blocks with inline declarations of blocks. -We could, **inside the implicit scope, replace the LED and switch instantiations and connections, with**: -```diff - ... -- self.sw = imp.Block(DigitalSwitch()) -- self.connect(self.mcu.gpio.request('sw'), self.sw.out) -+ (self.sw, ), _ = self.chain(imp.Block(DigitalSwitch()), self.mcu.gpio.request('sw')) - ... - for i in range(4): -- self.led[i] = imp.Block(IndicatorLed()) -- self.connect(self.mcu.gpio.request(f'led{i}'), self.led[i].signal) -+ (self.led[i], ), _ = self.chain(self.mcu.gpio.request(f'led{i}'), imp.Block(IndicatorLed())) -``` +Once we recompile, it should complete with no errors. -`chain` takes blocks and ports as arguments, from left to right as inputs to outputs, and does `connects` to chain them together. -The first argument is treated as the initial input, and the last element is treated as the final output. -Blocks in the middle (if any) have the previous link connected to their `Input`-tagged ports and present their `Output`-tagged ports for the next element, or attach their `InOut`-tagged port to the previous link which is also presented to the next element. -Only one pin per block may be tagged with `Input`, `Output`, and `InOut`. - -`chain` returns a chain object, which can be unpacked into a tuple of blocks that are part of the chain and the chain object itself. -The tuple of blocks can be used to name inline blocks declared in the chain (which is done in the blinky example to name the LED and switch), and the chain object can be used to name the links. - -> As a more complicated example, running `self.chain(Port1, Block1, Block2, Block3, Block4)` (with the block definitions written as are shown below) would produce this block diagram: -> ![Chain Connects Example](docs/chain.png) -> The chain starts at Port1. -> Block1 and Block2 have both an Input and Output port, so the chain goes "through" those blocks. -> Block3 has an InOut port, so it is attached to the previous connection, but the chain goes not go "through" it. -> Because Block4 is the last in the chain, it only needs an Input port. - ->
-> At this point, your HDL might look like... -> -> ```python -> class BlinkyExample(SimpleBoardTop): -> def contents(self) -> None: -> super().contents() -> self.usb = self.Block(UsbCReceptacle()) -> self.reg = self.Block(VoltageRegulator(3.3*Volt(tol=0.05))) -> self.connect(self.usb.gnd, self.reg.gnd) -> self.connect(self.usb.pwr, self.reg.pwr_in) -> -> with self.implicit_connect( -> ImplicitConnect(self.reg.pwr_out, [Power]), -> ImplicitConnect(self.reg.gnd, [Common]), -> ) as imp: -> self.mcu = imp.Block(Stm32f103_48()) -> -> (self.sw, ), _ = self.chain(imp.Block(DigitalSwitch()), self.mcu.gpio.request('sw')) -> -> self.led = ElementDict[IndicatorLed]() -> for i in range(4): -> (self.led[i], ), _ = self.chain(self.mcu.gpio.request(f'led{i}'), imp.Block(IndicatorLed())) -> -> def refinements(self) -> Refinements: -> return super().refinements() + Refinements( -> instance_refinements=[ -> (['reg'], Tps561201), -> ]) -> ``` ->
- - -## Changing the Microcontroller -_Finally, let's put the finishing touches on this design by changing the microcontroller and specifying a pin assignment._ - -### Using the IoController Abstract Class -Like the `VoltageRegulator`, there is actually an abstract class for microcontrollers, `IoController`. -`Stm32f103_48` extends this class and adheres to its interface, so we can **change the type of `mcu` to `IoController`**, then **add a refinement to `Stm32f103_48`**. +If we load the netlist into KiCad, we get the discrete microcontroller and its bundles of capacitors. +Because we used USB, the microcontroller subcircuit also automatically generated a crystal to meet USB timing requirements. +![Refined SwitchMatrix Layout](docs/switchmatrix_discrete_kicad.png) -```diff - class BlinkyExample(SimpleBoardTop): - def contents(self) -> None: - ... - with self.implicit_connect( - ... - ) as imp: -- self.mcu = imp.Block(Stm32f103_48()) -+ self.mcu = imp.Block(IoController()) - - def refinements(self) -> Refinements: - return super().refinements() + Refinements( - instance_refinements=[ - ... -+ (['mcu'], Stm32f103_48), - ]) -``` +After finishing this tutorial, see the [hierarchical layout tutorial](getting_started_hierarchy_layout.md) for speeding up layout by loading an existing microcontroller block layout. -> `IoController` defines an interface of a power and ground pin, then an array of common IOs including GPIO, ADC, SPI, I2C, and UART. -> Not all devices that implement it have all those capabilities (or the number of IOs requested), in which case they will fail with a compilation error. -> This interface generalizes beyond microcontrollers to anything that can control IOs, such as FPGAs. -With the abstract block in place, we can now easily change it to something else. -Perhaps we want a microcontroller with built-in wifi, so -**change the refinement to an `Esp32_Wroom_32`**. +## Adding addressable RGBs with Mixins -> If using the IDE, refinements can be changed the same way they are defined. -> The IDE will update the existing refinement instead of inserting a new entry. -### Explicit Pin Assignments -While `IoController` can assign peripherals like SPI pins according to the capabilities of each chip, it does not have access to layout data to do physically-based pin assignment. -However, it does define a `pin_assigns` parameter (as an array-of-strings) which allows specifying a pin number (on the footprint) or pin name (eg, `PC_13` - format specific to each microcontroller) for each requested pin. +Mixins are not supported with graphical edit actions. -We can also force parameter values through the refinements system, using `instance_values`. -Let's arbitrarily choose pins 26-29 for the LEDs. -**Add a pin assignment for the ESP32 in the refinements section**: -```diff - class BlinkyExample(SimpleBoardTop): - def refinements(self) -> Refinements: - return super().refinements() + Refinements( - instance_refinements=[ - ... -+ ], -+ instance_values=[ -+ (['mcu', 'pin_assigns'], [ -+ 'led0=26', -+ 'led1=27', -+ 'led2=28', -+ 'led3=29', -+ ]) - ]) +## Explicit Pin Assignments -``` ->
-> At this point, your HDL might look like... -> -> ```python -> class BlinkyExample(SimpleBoardTop): -> def contents(self) -> None: -> super().contents() -> self.usb = self.Block(UsbCReceptacle()) -> self.reg = self.Block(VoltageRegulator(3.3*Volt(tol=0.05))) -> self.connect(self.usb.gnd, self.reg.gnd) -> self.connect(self.usb.pwr, self.reg.pwr_in) -> -> with self.implicit_connect( -> ImplicitConnect(self.reg.pwr_out, [Power]), -> ImplicitConnect(self.reg.gnd, [Common]), -> ) as imp: -> self.mcu = imp.Block(IoController()) -> -> (self.sw, ), _ = self.chain(imp.Block(DigitalSwitch()), self.mcu.gpio.request('sw')) -> -> self.led = ElementDict[IndicatorLed]() -> for i in range(4): -> (self.led[i], ), _ = self.chain(self.mcu.gpio.request(f'led{i}'), imp.Block(IndicatorLed())) -> -> def refinements(self) -> Refinements: -> return super().refinements() + Refinements( -> instance_refinements=[ -> (['reg'], Tps561201), -> (['mcu'], Esp32_Wroom_32), -> ], -> instance_values=[ -> (['mcu', 'pin_assigns'], [ -> 'led0=26', -> 'led1=27', -> 'led2=28', -> 'led3=29', -> ]) -> ]) -> ``` ->
- -And that's it for system-level (top-level, as opposed to library construction) PCB design! -You can import the netlist into KiCad if you'd like. -Good luck with building PCBs! +## Implicit Connections + + +There is also a more complex `self.chain(...)` construct allowing for very compact HDL, detailed in the [reference document](reference.md). ## Defining Library Parts Continue to [the next part of the tutorial](getting_started_schimport.md) on defining a library Block with a KiCad schematic. + ### Additional Resources If you want to some more complex examples of boards designed in this HDL, check out: - [Keyboard](examples/test_keyboard.py): the fabbed-out version of this example, with a few more features and different choices of parts. diff --git a/getting_started_hierarchy_layout.md b/getting_started_hierarchy_layout.md new file mode 100644 index 000000000..e69de29bb diff --git a/getting_started_library.md b/getting_started_library.md index 402153b9c..f100575c6 100644 --- a/getting_started_library.md +++ b/getting_started_library.md @@ -5,6 +5,10 @@ _We do this in two stages, first defining a `FootprintBlock` for the chip itself > While `Block`s are arbitrary hierarchy blocks that only have ports, inner blocks, and connections, `FootprintBlock` also allows up to one PCB footprint, and a mapping from the block ports to footprint pins. > In schematic terms, think of `FootprintBlock` as analogous to a schematic symbol, while `Block` is closer to a hierarchy sheet. +### Dragons be Ahead + +Library block definition is a less polished and more complex experience than building boards using existing library blocks. + ## Creating a part Block definitions correspond to classes, and a new block can be defined by creating a new class. diff --git a/reference.md b/reference.md index 91aee72e2..86ddbb98c 100644 --- a/reference.md +++ b/reference.md @@ -128,7 +128,7 @@ self.tp_gnd = self.Block(GroundTestPoint()).connected(self.gnd) ### Refinements -Refinements allow specifying, at the top level, modification across the design hierarchy. +Refinements allow specifying, at the top level, modifications across the design hierarchy. ```python def refinements(self) -> Refinements: From a8cdce1278c3af34084ee42a9768f0d88eb75c73 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 14:03:03 -0700 Subject: [PATCH 14/41] Update getting-started.md --- getting-started.md | 56 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) diff --git a/getting-started.md b/getting-started.md index 1aee70578..24ddbeb93 100644 --- a/getting-started.md +++ b/getting-started.md @@ -434,7 +434,7 @@ We'll add in the USB type-C port that was previously part of the Xiao, and conne self.mcu = self.Block(IoController()) + self.connect(self.usb.gnd, self.mcu.gnd) + self.connect(self.usb.pwr, self.mcu.pwr) -+ self.connect(self.usb.usb, self.mcu.usb.request('usb)) ++ self.connect(self.usb.usb, self.mcu.usb.request('usb')) self.led = self.Block(IndicatorLed()) self.connect(self.usb.pwr, self.mcu.pwr) @@ -464,7 +464,7 @@ We'll insert a simple linear regulator, a step-down voltage converter. self.connect(self.usb.gnd, self.mcu.gnd) - self.connect(self.usb.pwr, self.mcu.pwr) + self.connect(self.reg.pwr_out, self.mcu.pwr) - self.connect(self.usb.usb, self.mcu.usb.request('usb)) + self.connect(self.usb.usb, self.mcu.usb.request('usb')) self.led = self.Block(IndicatorLed()) self.connect(self.usb.pwr, self.mcu.pwr) @@ -487,18 +487,68 @@ After finishing this tutorial, see the [hierarchical layout tutorial](getting_st ## Adding addressable RGBs with Mixins +**Make these changes** to the `contents` method: +```diff + class BlinkyExample(SimpleBoardTop): + def contents() -> None: + super().contents() + + self.usb = self.Block(UsbCReceptacle()) + + self.reg = self.Block(LinearRegulator(3.3*Volt(tol=0.05))) + self.connect(self.usb.gnd, self.reg.gnd) + self.connect(self.usb.pwr, self.reg.pwr_in) + + self.mcu = self.Block(IoController()) + self.connect(self.usb.gnd, self.mcu.gnd) + self.connect(self.reg.pwr_out, self.mcu.pwr) + self.connect(self.usb.usb, self.mcu.usb.request('usb')) + + self.led = self.Block(IndicatorLed()) + self.connect(self.usb.pwr, self.mcu.pwr) + self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) + + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) + ++ sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels()) ++ self.connect(self.usb.gnd, sw_npx.npx_gnd) ++ self.connect(self.usb.pwr, sw_npx.npx_pwr) + ++ self.npx_shift = self.Block(L74Ahct1g125()) ++ self.connect(self.usb.gnd, npx_shift.gnd) ++ self.connect(self.usb.pwr, npx_shift.pwr) ++ self.connect(self.mcu.gpio.request('npx'), self.npx_shift.input) ++ self.connect(self.npx_shift.output, sw_npx.npx_din) +``` Mixins are not supported with graphical edit actions. -## Explicit Pin Assignments +! mixins desc + +We have also added a buffer (`L74Ahct1g125`) to shift the 3.3v logic level of the microcontroller to the higher data voltage required by the addressable RGBs. +The RGBs datasheet defines their input thresholds as incompatible with 3.3v and this will generate ERC errors without the buffer. +Go ahead and try it! ## Implicit Connections +_The code is starting to get a bit long and tedious._ +Refactoring operations are not supported with graphical edit actions. +The IDE is not implicit-scope-aware for graphical edit actions. + There is also a more complex `self.chain(...)` construct allowing for very compact HDL, detailed in the [reference document](reference.md). + +## Explicit Pin Assignments + + + + ## Defining Library Parts Continue to [the next part of the tutorial](getting_started_schimport.md) on defining a library Block with a KiCad schematic. From d2394e7304f9eed5c6af5d5f08be16f0ba38c618 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 15:19:56 -0700 Subject: [PATCH 15/41] Update getting-started.md --- getting-started.md | 118 +++++++++++++++++++++++++++++++++++++-------- 1 file changed, 97 insertions(+), 21 deletions(-) diff --git a/getting-started.md b/getting-started.md index 24ddbeb93..13d4cb429 100644 --- a/getting-started.md +++ b/getting-started.md @@ -209,8 +209,7 @@ First, we need to connect the power and ground between the devices. super().contents() self.mcu = self.Block(Xiao_Rp2040()) self.led = self.Block(IndicatorLed()) -+ self.connect(self.usb.pwr, self.mcu.pwr) -+ self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) ++ self.connect(self.mcu.gnd, self.led.gnd) ```
Alternatively, with IDE graphical edit actions @@ -244,8 +243,7 @@ Make these changes to the `contents` method: super().contents() self.mcu = self.Block(Xiao_Rp2040()) self.led = self.Block(IndicatorLed()) - self.connect(self.usb.pwr, self.mcu.pwr) - self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) ``` @@ -311,8 +309,7 @@ __Now, we'll add a 3x2 switch matrix with just a few lines of code, this is wher super().contents() self.mcu = self.Block(Xiao_Rp2040()) self.led = self.Block(IndicatorLed()) - self.connect(self.usb.pwr, self.mcu.pwr) - self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gnd, self.led.gnd) self.connect(self.mcu.gpio.request('led'), self.led.signal) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) @@ -394,8 +391,7 @@ Because blocks encapsulate their subcircuits, using a discrete microcontroller i - self.mcu = self.Block(Xiao_Rp2040()) + self.mcu = self.Block(IoController()) self.led = self.Block(IndicatorLed()) - self.connect(self.usb.pwr, self.mcu.pwr) - self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gnd, self.led.gnd) self.connect(self.mcu.gpio.request('led'), self.led.signal) self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) @@ -437,8 +433,7 @@ We'll add in the USB type-C port that was previously part of the Xiao, and conne + self.connect(self.usb.usb, self.mcu.usb.request('usb')) self.led = self.Block(IndicatorLed()) - self.connect(self.usb.pwr, self.mcu.pwr) - self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gnd, self.led.gnd) self.connect(self.mcu.gpio.request('led'), self.led.signal) self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) @@ -467,8 +462,7 @@ We'll insert a simple linear regulator, a step-down voltage converter. self.connect(self.usb.usb, self.mcu.usb.request('usb')) self.led = self.Block(IndicatorLed()) - self.connect(self.usb.pwr, self.mcu.pwr) - self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gnd, self.led.gnd) self.connect(self.mcu.gpio.request('led'), self.led.signal) self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) @@ -486,6 +480,8 @@ After finishing this tutorial, see the [hierarchical layout tutorial](getting_st ## Adding addressable RGBs with Mixins +Electronics sometimes have variations-on-a-theme with a common base, for example adding addressable RGBs to the switch matrix without redefining it completely. +This is supported though **mixins**. **Make these changes** to the `contents` method: ```diff @@ -505,15 +501,14 @@ After finishing this tutorial, see the [hierarchical layout tutorial](getting_st self.connect(self.usb.usb, self.mcu.usb.request('usb')) self.led = self.Block(IndicatorLed()) - self.connect(self.usb.pwr, self.mcu.pwr) - self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gnd, self.led.gnd) self.connect(self.mcu.gpio.request('led'), self.led.signal) self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) -+ sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels()) ++ sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels(npx_order="row_snake")) + self.connect(self.usb.gnd, sw_npx.npx_gnd) + self.connect(self.usb.pwr, sw_npx.npx_pwr) @@ -526,7 +521,9 @@ After finishing this tutorial, see the [hierarchical layout tutorial](getting_st Mixins are not supported with graphical edit actions. -! mixins desc +Mixins are a way to require additional functionality (including ports and parameters) on a base abstract block. + +Mixins are also used elsewhere, such as adding optional IO types to IoController (like CAN or the requirement for onboard WiFi) or adding requiring a switch port on a rotary encoder. We have also added a buffer (`L74Ahct1g125`) to shift the 3.3v logic level of the microcontroller to the higher data voltage required by the addressable RGBs. The RGBs datasheet defines their input thresholds as incompatible with 3.3v and this will generate ERC errors without the buffer. @@ -534,23 +531,102 @@ Go ahead and try it! ## Implicit Connections -_The code is starting to get a bit long and tedious._ +_The code is starting to get a bit long and tedious. We'll refactor that using implicit scopes, a syntactic sugar construct, to make it shorter and more readable._ +**Replace** the `contents` method: +```python +class BlinkyExample(SimpleBoardTop): + def contents() -> None: + super().contents() + + self.usb = self.Block(UsbCReceptacle()) + + self.reg = self.Block(LinearRegulator(3.3*Volt(tol=0.05))) + self.connect(self.usb.gnd, self.reg.gnd) + self.connect(self.usb.pwr, self.reg.pwr_in) + + with self.implicit_connect( + ImplicitConnect(self.reg.pwr_out, [Power]), + ImplicitConnect(self.reg.gnd, [Common]), + ) as imp: + self.mcu = imp.Block(IoController()) + self.connect(self.usb.usb, self.mcu.usb.request('usb')) + + self.led = imp.Block(IndicatorLed()) + self.connect(self.mcu.gpio.request('led'), self.led.signal) + + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) + + with self.implicit_connect( + ImplicitConnect(self.usb.pwr, [Power]), + ImplicitConnect(self.usb.gnd, [Common]), + ) as imp: + sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels(npx_order="row_snake")) + self.connect(self.usb.gnd, sw_npx.npx_gnd) + self.connect(self.usb.pwr, sw_npx.npx_pwr) + + self.npx_shift = imp.Block(L74Ahct1g125()) + self.connect(self.mcu.gpio.request('npx'), self.npx_shift.input) + self.connect(self.npx_shift.output, sw_npx.npx_din) +``` Refactoring operations are not supported with graphical edit actions. The IDE is not implicit-scope-aware for graphical edit actions. -There is also a more complex `self.chain(...)` construct allowing for very compact HDL, detailed in the [reference document](reference.md). +The implicit scope defines the connections to make and the conditions for which ports to connect (through tags): +```python +with self.implicit_connect( + ImplicitConnect(self.reg.pwr_out, [Power]), + ImplicitConnect(self.reg.gnd, [Common]), +) as imp: + # any blocks here instantiated with imp.Block(...) instead of self.Block(...) + # will have Power-tagged ports connected to self.reg.pwr_out + # and Common-tagged ports connected to self.reg.gnd +``` +> When blocks define ports, they can associate tags with them to specify implicit connectivity. +> To prevent errors, all ports with tags are required to be connected, either implicitly (as in this section) or explicitly (through `connect` statements). +> +> The most common tags are `Power` (for a general positive voltage rail) and `Common` (for ground). -## Explicit Pin Assignments +Inside an implicit connection block, only blocks instantiated with `imp.Block(...)` have implicit connections made. +There is also a more complex `self.chain(...)` construct allowing for very compact HDL, detailed in the [reference document](reference.md). + + +### Explicit Pin Assignments +While `IoController` automatically IO pinnings according to the capabilities of each chip, it does not have access to layout data to do physically-based pin assignment. +However, it does define a `pin_assigns` parameter (as an array-of-strings) which allows specifying a pin number (on the footprint) or pin name (eg, `GPIO3` - format specific to each microcontroller) for each requested pin. +We can also force parameter values through the refinements system, using `instance_values`. +Let's arbitrarily choose pins 26-29 for the LEDs. +**Add a pin assignment for the ESP32 in the refinements section**: +```diff + class BlinkyExample(SimpleBoardTop): + def contents() -> None: + ... + + def refinements(self) -> Refinements: + return super().refinements() + Refinements( + ... ++ instance_values=[ ++ (['mcu', 'pin_assigns'], [ ++ 'led=10', ++ 'sw_col_0=16', ++ 'sw_col_1=17', ++ 'sw_col_2=18', ++ 'sw_row0=19', ++ 'sw_row1=20', ++ ]) + ]) +``` -## Defining Library Parts -Continue to [the next part of the tutorial](getting_started_schimport.md) on defining a library Block with a KiCad schematic. +## Next: Hierarchical Layout +Continue to the [hierarchical layout tutorial](getting_started_hierarchy_layout.md) for using the hierarchical netlist to help with reuse in board layout. ### Additional Resources From c7a542af080410f99ee1fe8c76b320cf5106d42d Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 15:24:37 -0700 Subject: [PATCH 16/41] Update getting-started.md --- getting-started.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/getting-started.md b/getting-started.md index 13d4cb429..3711253c2 100644 --- a/getting-started.md +++ b/getting-started.md @@ -32,7 +32,7 @@ While the user-facing HDL design model is connections between ports, the interna Links are a block-like construct (diamonds in the diagram) that define how parameters propagate between ports and constraints on them. ![Blinky Hierarchy Block Diagram](docs/blinky_model_full.png) -Continuing the digital IO example, the link checks the output thresholds against the input thresholds and calculate the full range of voltage levels given all connected drivers. +Continuing the digital IO example, the link checks the output thresholds against the input thresholds and calculates the full range of voltage levels given all connected drivers. These could be viewed as a block-like object (diamonds on the diagram) instead of direct wire connections: All links are fully defined in the same HDL code, and you can inspect the link definitions of included port types to see how they work and what they check. @@ -63,13 +63,13 @@ Specifically, it: - allows inspection of solved / computed parameters in the design - provides schematic-like graphical edit actions to insert HDL -The graphical edit actions have significant limitations (and probably bugs / unhandled edge cases) compared to the full HDL and is best suited for simple designs or as a learning tool. +The graphical edit actions have significant limitations (and probably bugs / unhandled edge cases) compared to the full HDL and are best suited for simple designs or as a learning tool. **Consider it more of a tech demonstrator and proof-of-concept** but do give it a try. ![Annotated IDE screen](docs/ide/overview.png) The IDE has these major components: -- **Block Diagram Visualization**: shows the compiled design visualized as a block diagram here. +- **Block Diagram Visualization**: shows the compiled design visualized as a block diagram. - **Design Tree**: shows the compiled design as a tree structure of the block hierarchy. - **Library Browser**: shows all the library blocks, ports, and links. The text box at the top allows filtering by keyword. @@ -323,8 +323,8 @@ TODO Write Me
-`SwitchMatrix` is a generator block that takes the number of columns (width) and rows (height) as parameters and generates the switch matrix (including diodes for mutli-key detection). -For the keyboard enthusiasts, this generates COL2ROW circuits. +`SwitchMatrix` is a generator block that takes the number of columns (width) and rows (height) as parameters and generates the switch matrix (including diodes for multi-key detection). +For keyboard enthusiasts, this generates COL2ROW circuits. `SwitchMatrix` has two ports, `cols` and `rows`, both of which are port arrays. Unlike microcontrollers, where the array is defined by its incoming connections (are elements sinks), `SwitchMatrix` port arrays are internally defined (are elements sources) based on the parameters. @@ -412,7 +412,7 @@ Refactoring and delete operations are not supported with graphical edit actions. However, you can delete lines of code, then recompile, then insert new blocks and connections using the graphical edits flow. Instead of directly replacing the microcontroller, we replace it with the `IoController` abstract block, which all microcontrollers implement. -Then, we specify refine that to a specific microcontroller, here the STM32F103. +Then, we refine that to a specific microcontroller, here the STM32F103. If we recompile this now, it will give errors since the microcontroller has no power source. @@ -481,7 +481,7 @@ After finishing this tutorial, see the [hierarchical layout tutorial](getting_st ## Adding addressable RGBs with Mixins Electronics sometimes have variations-on-a-theme with a common base, for example adding addressable RGBs to the switch matrix without redefining it completely. -This is supported though **mixins**. +This is supported through **mixins**. **Make these changes** to the `contents` method: ```diff @@ -513,8 +513,8 @@ This is supported though **mixins**. + self.connect(self.usb.pwr, sw_npx.npx_pwr) + self.npx_shift = self.Block(L74Ahct1g125()) -+ self.connect(self.usb.gnd, npx_shift.gnd) -+ self.connect(self.usb.pwr, npx_shift.pwr) ++ self.connect(self.usb.gnd, self.npx_shift.gnd) ++ self.connect(self.usb.pwr, self.npx_shift.pwr) + self.connect(self.mcu.gpio.request('npx'), self.npx_shift.input) + self.connect(self.npx_shift.output, sw_npx.npx_din) ``` @@ -598,12 +598,12 @@ There is also a more complex `self.chain(...)` construct allowing for very compa ### Explicit Pin Assignments -While `IoController` automatically IO pinnings according to the capabilities of each chip, it does not have access to layout data to do physically-based pin assignment. +While `IoController` automatically assigns IO pinnings according to the capabilities of each chip, it does not have access to layout data to do physically-based pin assignment. However, it does define a `pin_assigns` parameter (as an array-of-strings) which allows specifying a pin number (on the footprint) or pin name (eg, `GPIO3` - format specific to each microcontroller) for each requested pin. We can also force parameter values through the refinements system, using `instance_values`. Let's arbitrarily choose pins 26-29 for the LEDs. -**Add a pin assignment for the ESP32 in the refinements section**: +**Add a pin assignment for the STM32 in the refinements section**: ```diff class BlinkyExample(SimpleBoardTop): def contents() -> None: @@ -630,7 +630,7 @@ Continue to the [hierarchical layout tutorial](getting_started_hierarchy_layout. ### Additional Resources -If you want to some more complex examples of boards designed in this HDL, check out: +For some more complex examples of boards designed in this HDL, check out: - [Keyboard](examples/test_keyboard.py): the fabbed-out version of this example, with a few more features and different choices of parts. - [LED Matrix](examples/test_ledmatrix.py): a charlieplexed LED matrix, using a parameterized charlieplexing LED array generator. - [Seven Segment Clock](examples/test_seven_segment.py): an IoT (ESP32S3) seven-segment LED clock, using individually-addressable RGBs for each segment. From 599af90de2e5049230d4b82e9f8ee2b8903238c0 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 15:45:10 -0700 Subject: [PATCH 17/41] wip --- getting-started.md | 276 ++++++++++++++++++----------------- getting_started_library.md | 2 +- getting_started_schimport.md | 4 + 3 files changed, 150 insertions(+), 132 deletions(-) diff --git a/getting-started.md b/getting-started.md index 3711253c2..093343058 100644 --- a/getting-started.md +++ b/getting-started.md @@ -3,8 +3,18 @@ Introductory tutorial and example starter project, building towards a basic mechanical keyboard macropad. +## Goals +The main goal of this HDL are: +- enable libraries of subcircuits, through concepts supporting direct (without modification) reuse of subcircuit blocks, even in projects with different requirements +- automate simple calculations, like resistor sizing +- automate passive parts selections, like choosing resistors given a spec +- automate simple correctness checks, including voltage limits, current limits, and logic level compatibility + +These capabilities will be shown throughout this tutorial. + + ## Core concepts -The core abstraction is the hierarchical block diagram, which we will explain using an example design of a microcontroller driving an LED. +The core abstraction is the hierarchical block diagram, shown here using an example design of a microcontroller driving an LED. In conventional schematic tools, such a design could be a flat schematic, consisting of the microcontroller module, LED, and resistor: ![Blinky Hierarchy Block Diagram](docs/blinky_model_flat.png) @@ -90,13 +100,13 @@ from edg import * class BlinkyExample(SimpleBoardTop): - def contents(self) -> None: - super().contents() - # your implementation here + def contents(self) -> None: + super().contents() + # your implementation here if __name__ == "__main__": - compile_board_inplace(BlinkyExample) + compile_board_inplace(BlinkyExample) ``` - `from edg import *` brings in the base classes for circuit construction, like `SimpleBoardTop`. @@ -146,10 +156,10 @@ For this simple example, we connect an LED to a self-powered Xiao Rp2040 microco **Make these changes** to the `contents` method: ```diff def contents(self) -> None: - super().contents() -- # your implementation here -+ self.mcu = self.Block(Xiao_Rp2040()) -+ self.led = self.Block(IndicatorLed()) + super().contents() +- # your implementation here ++ self.mcu = self.Block(Xiao_Rp2040()) ++ self.led = self.Block(IndicatorLed()) ```
Alternatively, with IDE graphical edit actions @@ -206,10 +216,10 @@ First, we need to connect the power and ground between the devices. **Make these changes** to the `contents` method: ```diff def contents() -> None: - super().contents() - self.mcu = self.Block(Xiao_Rp2040()) - self.led = self.Block(IndicatorLed()) -+ self.connect(self.mcu.gnd, self.led.gnd) + super().contents() + self.mcu = self.Block(Xiao_Rp2040()) + self.led = self.Block(IndicatorLed()) ++ self.connect(self.mcu.gnd, self.led.gnd) ```
Alternatively, with IDE graphical edit actions @@ -240,11 +250,11 @@ Make these changes to the `contents` method: ```diff def contents() -> None: - super().contents() - self.mcu = self.Block(Xiao_Rp2040()) - self.led = self.Block(IndicatorLed()) - self.connect(self.mcu.gnd, self.led.gnd) -+ self.connect(self.mcu.gpio.request('led'), self.led.signal) + super().contents() + self.mcu = self.Block(Xiao_Rp2040()) + self.led = self.Block(IndicatorLed()) + self.connect(self.mcu.gnd, self.led.gnd) ++ self.connect(self.mcu.gpio.request('led'), self.led.signal) ```
Alternatively, with IDE graphical edit actions @@ -275,6 +285,8 @@ Port arrays behave differently when viewed externally (as we're doing here) and Internal usage of port arrays will be covered later in the library building section. This should now compile without errors. +The LED subcircuit automatically calculates the resistor specification from the connected microcontroller's GPIO voltage and a builtin wide target current range (1-10mA). +The resistor in the LED subcircuit then chooses a suitable resistor from its parts table. If using the IDE: the compiled block diagram should look like: ![Fully connected block diagram](docs/ide/ide_blinky_connect.png) @@ -306,15 +318,15 @@ __Now, we'll add a 3x2 switch matrix with just a few lines of code, this is wher **Make these changes** to the `contents` method: ```diff def contents() -> None: - super().contents() - self.mcu = self.Block(Xiao_Rp2040()) - self.led = self.Block(IndicatorLed()) - self.connect(self.mcu.gnd, self.led.gnd) - self.connect(self.mcu.gpio.request('led'), self.led.signal) - -+ self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) -+ self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) -+ self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) + super().contents() + self.mcu = self.Block(Xiao_Rp2040()) + self.led = self.Block(IndicatorLed()) + self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) + ++ self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) ++ self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) ++ self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) ```
Alternatively, with IDE graphical edit actions @@ -344,8 +356,8 @@ Internally, SwitchMatrix uses the abstract `Switch` block, and `SimpleBoardTop` **Make these changes** to the `contents` method: ```diff class BlinkyExample(SimpleBoardTop): - def contents(self) -> None: - ... + def contents(self) -> None: + ... + @override + def refinements(self) -> Refinements: @@ -386,26 +398,26 @@ Because blocks encapsulate their subcircuits, using a discrete microcontroller i **Make these changes** to the design: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: - super().contents() -- self.mcu = self.Block(Xiao_Rp2040()) -+ self.mcu = self.Block(IoController()) - self.led = self.Block(IndicatorLed()) - self.connect(self.mcu.gnd, self.led.gnd) - self.connect(self.mcu.gpio.request('led'), self.led.signal) - - self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) - self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) - self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) - - @override - def refinements(self) -> Refinements: - return super().refinements() + Refinements( - class_refinements=[ -+ (IoController, Stm32f103_48), - (Switch, KailhSocket), - ], - ) + def contents() -> None: + super().contents() +- self.mcu = self.Block(Xiao_Rp2040()) ++ self.mcu = self.Block(IoController()) + self.led = self.Block(IndicatorLed()) + self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) + + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) + + @override + def refinements(self) -> Refinements: + return super().refinements() + Refinements( + class_refinements=[ ++ (IoController, Stm32f103_48), + (Switch, KailhSocket), + ], + ) ``` Refactoring and delete operations are not supported with graphical edit actions. @@ -422,23 +434,23 @@ We'll add in the USB type-C port that was previously part of the Xiao, and conne **Make these changes** to the `contents` method: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: - super().contents() - -+ self.usb = self.Block(UsbCReceptacle()) + def contents() -> None: + super().contents() + ++ self.usb = self.Block(UsbCReceptacle()) + + self.mcu = self.Block(IoController()) ++ self.connect(self.usb.gnd, self.mcu.gnd) ++ self.connect(self.usb.pwr, self.mcu.pwr) ++ self.connect(self.usb.usb, self.mcu.usb.request('usb')) + + self.led = self.Block(IndicatorLed()) + self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) - self.mcu = self.Block(IoController()) -+ self.connect(self.usb.gnd, self.mcu.gnd) -+ self.connect(self.usb.pwr, self.mcu.pwr) -+ self.connect(self.usb.usb, self.mcu.usb.request('usb')) - - self.led = self.Block(IndicatorLed()) - self.connect(self.mcu.gnd, self.led.gnd) - self.connect(self.mcu.gpio.request('led'), self.led.signal) - - self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) - self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) - self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) ``` We will still get errors if we recompile, since USB provides 5v, while the STM32F103 is a 3.3v part. @@ -446,28 +458,28 @@ We'll insert a simple linear regulator, a step-down voltage converter. **Make these changes** to the `contents` method: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: - super().contents() + def contents() -> None: + super().contents() + + self.usb = self.Block(UsbCReceptacle()) + ++ self.reg = self.Block(LinearRegulator(3.3*Volt(tol=0.05))) ++ self.connect(self.usb.gnd, self.reg.gnd) ++ self.connect(self.usb.pwr, self.reg.pwr_in) + + self.mcu = self.Block(IoController()) + self.connect(self.usb.gnd, self.mcu.gnd) +- self.connect(self.usb.pwr, self.mcu.pwr) ++ self.connect(self.reg.pwr_out, self.mcu.pwr) + self.connect(self.usb.usb, self.mcu.usb.request('usb')) + + self.led = self.Block(IndicatorLed()) + self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) - self.usb = self.Block(UsbCReceptacle()) - -+ self.reg = self.Block(LinearRegulator(3.3*Volt(tol=0.05))) -+ self.connect(self.usb.gnd, self.reg.gnd) -+ self.connect(self.usb.pwr, self.reg.pwr_in) - - self.mcu = self.Block(IoController()) - self.connect(self.usb.gnd, self.mcu.gnd) -- self.connect(self.usb.pwr, self.mcu.pwr) -+ self.connect(self.reg.pwr_out, self.mcu.pwr) - self.connect(self.usb.usb, self.mcu.usb.request('usb')) - - self.led = self.Block(IndicatorLed()) - self.connect(self.mcu.gnd, self.led.gnd) - self.connect(self.mcu.gpio.request('led'), self.led.signal) - - self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) - self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) - self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) ``` Once we recompile, it should complete with no errors. @@ -486,37 +498,37 @@ This is supported through **mixins**. **Make these changes** to the `contents` method: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: - super().contents() - - self.usb = self.Block(UsbCReceptacle()) - - self.reg = self.Block(LinearRegulator(3.3*Volt(tol=0.05))) - self.connect(self.usb.gnd, self.reg.gnd) - self.connect(self.usb.pwr, self.reg.pwr_in) - - self.mcu = self.Block(IoController()) - self.connect(self.usb.gnd, self.mcu.gnd) - self.connect(self.reg.pwr_out, self.mcu.pwr) - self.connect(self.usb.usb, self.mcu.usb.request('usb')) - - self.led = self.Block(IndicatorLed()) - self.connect(self.mcu.gnd, self.led.gnd) - self.connect(self.mcu.gpio.request('led'), self.led.signal) - - self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) - self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) - self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) + def contents() -> None: + super().contents() + + self.usb = self.Block(UsbCReceptacle()) + + self.reg = self.Block(LinearRegulator(3.3*Volt(tol=0.05))) + self.connect(self.usb.gnd, self.reg.gnd) + self.connect(self.usb.pwr, self.reg.pwr_in) + + self.mcu = self.Block(IoController()) + self.connect(self.usb.gnd, self.mcu.gnd) + self.connect(self.reg.pwr_out, self.mcu.pwr) + self.connect(self.usb.usb, self.mcu.usb.request('usb')) + + self.led = self.Block(IndicatorLed()) + self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request('led'), self.led.signal) -+ sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels(npx_order="row_snake")) -+ self.connect(self.usb.gnd, sw_npx.npx_gnd) -+ self.connect(self.usb.pwr, sw_npx.npx_pwr) - -+ self.npx_shift = self.Block(L74Ahct1g125()) -+ self.connect(self.usb.gnd, self.npx_shift.gnd) -+ self.connect(self.usb.pwr, self.npx_shift.pwr) -+ self.connect(self.mcu.gpio.request('npx'), self.npx_shift.input) -+ self.connect(self.npx_shift.output, sw_npx.npx_din) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) + ++ sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels(npx_order="row_snake")) ++ self.connect(self.usb.gnd, sw_npx.npx_gnd) ++ self.connect(self.usb.pwr, sw_npx.npx_pwr) + ++ self.npx_shift = self.Block(L74Ahct1g125()) ++ self.connect(self.usb.gnd, self.npx_shift.gnd) ++ self.connect(self.usb.pwr, self.npx_shift.pwr) ++ self.connect(self.mcu.gpio.request('npx'), self.npx_shift.input) ++ self.connect(self.npx_shift.output, sw_npx.npx_din) ``` Mixins are not supported with graphical edit actions. @@ -606,28 +618,30 @@ Let's arbitrarily choose pins 26-29 for the LEDs. **Add a pin assignment for the STM32 in the refinements section**: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: - ... - - def refinements(self) -> Refinements: - return super().refinements() + Refinements( + def contents() -> None: ... -+ instance_values=[ -+ (['mcu', 'pin_assigns'], [ -+ 'led=10', -+ 'sw_col_0=16', -+ 'sw_col_1=17', -+ 'sw_col_2=18', -+ 'sw_row0=19', -+ 'sw_row1=20', -+ ]) - ]) + + def refinements(self) -> Refinements: + return super().refinements() + Refinements( + ... ++ instance_values=[ ++ (['mcu', 'pin_assigns'], [ ++ 'led=10', ++ 'sw_col_0=16', ++ 'sw_col_1=17', ++ 'sw_col_2=18', ++ 'sw_row0=19', ++ 'sw_row1=20', ++ ]) + ]) ``` ## Next: Hierarchical Layout Continue to the [hierarchical layout tutorial](getting_started_hierarchy_layout.md) for using the hierarchical netlist to help with reuse in board layout. +Or, continue to [the library block definition tutorial using KiCad schematic import](getting_started_schimport.md). + ### Additional Resources For some more complex examples of boards designed in this HDL, check out: diff --git a/getting_started_library.md b/getting_started_library.md index f100575c6..af0573aca 100644 --- a/getting_started_library.md +++ b/getting_started_library.md @@ -5,8 +5,8 @@ _We do this in two stages, first defining a `FootprintBlock` for the chip itself > While `Block`s are arbitrary hierarchy blocks that only have ports, inner blocks, and connections, `FootprintBlock` also allows up to one PCB footprint, and a mapping from the block ports to footprint pins. > In schematic terms, think of `FootprintBlock` as analogous to a schematic symbol, while `Block` is closer to a hierarchy sheet. -### Dragons be Ahead +### Dragons be Ahead Library block definition is a less polished and more complex experience than building boards using existing library blocks. diff --git a/getting_started_schimport.md b/getting_started_schimport.md index b880c6f74..7ad0b1626 100644 --- a/getting_started_schimport.md +++ b/getting_started_schimport.md @@ -10,6 +10,10 @@ _In this section, we build a graphical-schematic-defined HX711-based load cell a > Schematic-defined blocks can make use of HDL library blocks (as schematic components), including all the automation (like automatic parts selection from a parts table) those libraries provide. +### Dragons be Ahead +Library block definition is a less polished and more complex experience than building boards using existing library blocks. + + ## Schematic Definition **Start by drawing the application schematic for the HX711**, as described in Figure 4 of its [datasheet](https://cdn.sparkfun.com/datasheets/Sensors/ForceFlex/hx711_english.pdf). From 415f0f98117c95559b2de17fd8881ef7f55ebfbf Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 16:29:53 -0700 Subject: [PATCH 18/41] cleanup categorization --- edg/circuits/BootstrapCapacitor.py | 2 +- edg/circuits/PowerCircuits.py | 2 +- edg/circuits/SwitchMatrix.py | 6 +++--- edg/circuits/VoltageComparator.py | 2 +- edg/electronics_interfaces/CircuitPackingBlock.py | 6 +++--- edg/electronics_model/SubboardBlock.py | 6 +++++- edg/parts/analog/opamp/Ina826.py | 2 +- edg/parts/interface/Rf_Sx1262.py | 2 +- edg/parts/power/FuelGauge_Max17048.py | 2 +- edg/parts/power/motor/StepperDriver_A4988.py | 4 ++-- getting-started.md | 13 +++++++++---- 11 files changed, 28 insertions(+), 19 deletions(-) diff --git a/edg/circuits/BootstrapCapacitor.py b/edg/circuits/BootstrapCapacitor.py index 3f1163420..b0b74c8fa 100644 --- a/edg/circuits/BootstrapCapacitor.py +++ b/edg/circuits/BootstrapCapacitor.py @@ -2,7 +2,7 @@ from ..abstract_parts import * -class BootstrapCapacitor(Block): +class BootstrapCapacitor(InternalBlock, Block): """A Capacitor wrapper for bootstrap capacitors, with a negative VoltageSink and a positive VoltageSource. This is meant to be used only with bootstrap pins on power conversion chips, that source some voltage and sink the boosted voltage. This is not meant to be general-purpose and will not function standalone. diff --git a/edg/circuits/PowerCircuits.py b/edg/circuits/PowerCircuits.py index 865d7b6e5..f2dad1008 100644 --- a/edg/circuits/PowerCircuits.py +++ b/edg/circuits/PowerCircuits.py @@ -139,7 +139,7 @@ def generate(self) -> None: self.connect(self.reset, self.driver.with_mixin(Resettable()).reset) -class RampLimiter(KiCadSchematicBlock): +class RampLimiter(PowerConditioner, KiCadSchematicBlock): """PMOS-based ramp limiter that roughly targets a constant-dV/dt ramp. The cgd should be specified to swamp (10x+) the parasitic Cgd of the FET to get more controlled parameters. The target ramp rate is in volts/second, and for a capacitive load this can be calculated from a target current with diff --git a/edg/circuits/SwitchMatrix.py b/edg/circuits/SwitchMatrix.py index 21af7a03e..846910e82 100644 --- a/edg/circuits/SwitchMatrix.py +++ b/edg/circuits/SwitchMatrix.py @@ -77,7 +77,7 @@ def contents(self) -> None: @abstract_block_default(lambda: SwitchDiodeMatrix) -class SwitchMatrix(InternalBlock, Block): +class SwitchMatrix(HumanInterface, Block): def __init__(self, ncols: IntLike, nrows: IntLike, voltage_drop: RangeLike = (0, 0.7) * Volt): super().__init__() @@ -90,7 +90,7 @@ def __init__(self, ncols: IntLike, nrows: IntLike, voltage_drop: RangeLike = (0, self.cols = self.Port(Vector(DigitalSource.empty())) -class SwitchDiodeMatrix(SwitchMatrix, HumanInterface, GeneratorBlock, SvgPcbTemplateBlock): +class SwitchDiodeMatrix(SwitchMatrix, GeneratorBlock, SvgPcbTemplateBlock): """A switch matrix, such as for a keyboard, that generates (nrows * ncols) switches while only using max(nrows, ncols) IOs. @@ -249,7 +249,7 @@ def __init__(self, *args: Any, npx_order: StringLike = "row_snake", **kwargs: An self.npx_gnd = self.Port(Ground.empty()) -class SwitchDiodeMatrixNeopixels(SwitchMatrixNeopixels, SwitchDiodeMatrix, HumanInterface, GeneratorBlock): +class SwitchDiodeMatrixNeopixels(SwitchMatrixNeopixels, SwitchDiodeMatrix, GeneratorBlock): """SwitchMatrix implementation with neopixel chain.""" def __init__(self, *args: Any, **kwargs: Any) -> None: diff --git a/edg/circuits/VoltageComparator.py b/edg/circuits/VoltageComparator.py index ccb76ac4d..43c793e7f 100644 --- a/edg/circuits/VoltageComparator.py +++ b/edg/circuits/VoltageComparator.py @@ -4,7 +4,7 @@ from .ResistiveDivider import VoltageDivider, FeedbackVoltageDivider -class VoltageComparator(GeneratorBlock): +class VoltageComparator(Analog, GeneratorBlock): """A comparator subcircuit that compares an input voltage rail against some reference, either internally generated from the power lines or an external analog signals. Accounts for tolerance stackup on the reference input - so make sure the trip diff --git a/edg/electronics_interfaces/CircuitPackingBlock.py b/edg/electronics_interfaces/CircuitPackingBlock.py index 370ec720c..ed52edaaf 100644 --- a/edg/electronics_interfaces/CircuitPackingBlock.py +++ b/edg/electronics_interfaces/CircuitPackingBlock.py @@ -15,7 +15,7 @@ def packed(self, elts: BasePort, merged: BasePort) -> None: self.nets_packed = self.Metadata({"src": self._ports.name_of(elts), "dst": self._ports.name_of(merged)}) -class PackedPassive(GeneratorBlock): +class PackedPassive(InternalSubcircuit, GeneratorBlock): """A pseudoblock that asserts all elts are connected to the same net, then connects them to merged.""" def __init__(self) -> None: @@ -36,7 +36,7 @@ def generate(self) -> None: ) -class PackedGround(GeneratorBlock): +class PackedGround(InternalSubcircuit, GeneratorBlock): """Takes in several Ground connections that are of the same net (asserted in netlister), and provides a single Ground.""" @@ -59,7 +59,7 @@ def generate(self) -> None: self.assign(self.gnd_out.voltage, self.gnd_ins.hull(lambda x: x.link().voltage)) -class PackedVoltageSource(GeneratorBlock): +class PackedVoltageSource(InternalSubcircuit, GeneratorBlock): """Takes in several VoltageSink connections that are of the same net (asserted in netlister), and provides a single VoltageSource. Distributes the current draw from the VoltageSource equally among the inputs.""" diff --git a/edg/electronics_model/SubboardBlock.py b/edg/electronics_model/SubboardBlock.py index e43572b20..3c9ffb94e 100644 --- a/edg/electronics_model/SubboardBlock.py +++ b/edg/electronics_model/SubboardBlock.py @@ -5,6 +5,7 @@ from ..core.Core import Refable from ..core.HdlUserExceptions import UnconnectableError from .. import edgir +from .Categories import DiscreteComponent @non_library @@ -68,6 +69,7 @@ def _populate_def_proto_hierarchy(self, pb: edgir.HierarchyBlock, ref_map: Refab constraint_pb.exported.tap = True +@non_library class SubboardBlock(HasSubboardBlockApi, Block): """A block that is a sub-board, where all its blocks not marked external are part of a different board. Provides the export_tap construct to tack connectors onto ports without breaking modeling. @@ -81,6 +83,7 @@ def __init__(self) -> None: self.fp_subboard = self.Metadata("A") # dummy distinct value +@non_library class WrapperSubboardBlock(SubboardBlock): """A wrapper block where the internal blocks are skipped for netlisting and used for modeling only. Useful for eg, dev boards that only generate a connector or socket but re-use modeling from the raw subcircuit.""" @@ -90,7 +93,8 @@ def __init__(self) -> None: self.fp_subblocks_ignored = self.Metadata("B") # dummy distinct value -class SubboardConnectorPair(HasSubboardBlockApi, Block): +@abstract_block +class SubboardConnectorPair(DiscreteComponent, HasSubboardBlockApi, Block): """A block meant for a connector pair, one in the exterior and one in the interior, of a SubboardBlock. When in a SubboardBlock scope and marked external, this inherits the parent and self board scope of its container, so inner Blocks marked external are part of the SubboardBlock's parent scope, while internal Blocks diff --git a/edg/parts/analog/opamp/Ina826.py b/edg/parts/analog/opamp/Ina826.py index e3872e904..e56e18492 100644 --- a/edg/parts/analog/opamp/Ina826.py +++ b/edg/parts/analog/opamp/Ina826.py @@ -70,7 +70,7 @@ def contents(self) -> None: self.assign(self.actual_basic_part, False) -class Ina826(KiCadImportableBlock, GeneratorBlock): +class Ina826(Sensor, KiCadImportableBlock, GeneratorBlock): """Cost-effective instrumentation amplifier in SOIC-8, with gain 1-1000 set by single resistor. TODO: DiffAmp / InAmp abstract class, which supports KiCadImportableBlock """ diff --git a/edg/parts/interface/Rf_Sx1262.py b/edg/parts/interface/Rf_Sx1262.py index becb0be2c..f71b1b01e 100644 --- a/edg/parts/interface/Rf_Sx1262.py +++ b/edg/parts/interface/Rf_Sx1262.py @@ -64,7 +64,7 @@ def contents(self) -> None: self.assign(self.actual_basic_part, False) -class Pe4259(Block): +class Pe4259(InternalSubcircuit, Block): """RF switch between 10 MHz to 3000 MHz, 1.8-3.3v input. Requires all RF pins be held at 0v or are DC-blocked with a series cap. TODO: perhaps a RfSwitch base class? maybe some relation to AnalogSwitch? (though not valid at DC) diff --git a/edg/parts/power/FuelGauge_Max17048.py b/edg/parts/power/FuelGauge_Max17048.py index eaabff60f..3d2225d08 100644 --- a/edg/parts/power/FuelGauge_Max17048.py +++ b/edg/parts/power/FuelGauge_Max17048.py @@ -53,7 +53,7 @@ def contents(self) -> None: self.assign(self.actual_basic_part, False) -class Max17048(DefaultExportBlock): +class Max17048(Sensor, DefaultExportBlock): """1-Cell Li-Ion voltage based fuel gauge. Senses its pwr as the battery voltage.""" def __init__(self) -> None: diff --git a/edg/parts/power/motor/StepperDriver_A4988.py b/edg/parts/power/motor/StepperDriver_A4988.py index 2c66f7f1c..e6f99e233 100644 --- a/edg/parts/power/motor/StepperDriver_A4988.py +++ b/edg/parts/power/motor/StepperDriver_A4988.py @@ -111,7 +111,7 @@ def contents(self) -> None: self.assign(self.lcsc_part, "C38437") -class A4988(GeneratorBlock): +class A4988(MotorDriver, GeneratorBlock): """Bipolar stepper motor driver with microstepping (1:2/4/8/16) and current limiting. 8-35V input, up to 2A.""" def __init__( @@ -302,7 +302,7 @@ def generate(self) -> None: ) -class PololuA4988(BrushedMotorDriver, WrapperSubboardBlock): +class PololuA4988(MotorDriver, WrapperSubboardBlock): """Pololu breakout board for the A4988 stepper driver. Adjustable current limit with onboard trimpot.""" def __init__(self, step_resolution: IntLike = 16): diff --git a/getting-started.md b/getting-started.md index 093343058..c2ebb457e 100644 --- a/getting-started.md +++ b/getting-started.md @@ -6,9 +6,9 @@ Introductory tutorial and example starter project, building towards a basic mech ## Goals The main goal of this HDL are: - enable libraries of subcircuits, through concepts supporting direct (without modification) reuse of subcircuit blocks, even in projects with different requirements -- automate simple calculations, like resistor sizing -- automate passive parts selections, like choosing resistors given a spec -- automate simple correctness checks, including voltage limits, current limits, and logic level compatibility +- automate straightforward calculations, like resistor sizing +- automate passive parts selections, like choosing resistors from a parts table +- automate common correctness checks, including voltage limits, current limits, and logic level compatibility These capabilities will be shown throughout this tutorial. @@ -67,7 +67,7 @@ That is, blocks are "placed" or instantiated, and their ports are connected, thr ### Optional Integrated Development Environment (IDE) with Graphical Editor -We have also built a basic IDE (as a PyCharm plugin) that provides some basic graphical integrations for working with HDL. +We have also built a basic IDE (as a PyCharm plugin, must be compiled locally) that provides some basic graphical integrations for working with HDL. Specifically, it: - generates a block diagram visualization of the design - allows inspection of solved / computed parameters in the design @@ -296,6 +296,9 @@ If using the IDE: the compiled block diagram should look like: If you have KiCad installed, you can import the design into the layout editor. _KiCad 6.0+ is required, the netlist format is not compatible with 5.x or lower!_ +This example needs the Seeed Studio KiCad footprint library: https://github.com/Seeed-Studio/OPL_Kicad_Library +Don't worry about installing it, in a few sections this will be replaced with a standard STM32. + In the KiCad standalone PCB Editor (layout tool), go to File > Import > Netlist..., and open the netlist file generated. KiCad will produce an initial placement that roughly clusters components according to their hierarchical grouping: ![Blinky layout with default placement](docs/blinky_kicad.png) @@ -311,6 +314,8 @@ This can be useful during placement to understand the function of each component As you continue to modify HDL, the unique component identifiers (tstamps) are stable and allows you to update a partial layout with a new netlist. **Unique component identifiers are generated from Block names, so if HDL names change those footprints will not update.** +Component refdeses are generated in order of block instantiation, depth-first. + ## Adding a Switch Matrix Generator __Now, we'll add a 3x2 switch matrix with just a few lines of code, this is where generators really shine!__ From 2690cd57610d44144addddb7e7d2c5d11c336ac4 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 16:37:32 -0700 Subject: [PATCH 19/41] Update getting_started_library.md --- getting_started_library.md | 54 +++++--------------------------------- 1 file changed, 7 insertions(+), 47 deletions(-) diff --git a/getting_started_library.md b/getting_started_library.md index af0573aca..69d380689 100644 --- a/getting_started_library.md +++ b/getting_started_library.md @@ -9,6 +9,9 @@ _We do this in two stages, first defining a `FootprintBlock` for the chip itself ### Dragons be Ahead Library block definition is a less polished and more complex experience than building boards using existing library blocks. +This tutorial only walks through the basics and constructs. +The next best place is to look through the parts libraries for how these work in practice. + ## Creating a part Block definitions correspond to classes, and a new block can be defined by creating a new class. @@ -24,14 +27,7 @@ class Lf21215tmr_Device(FootprintBlock): # block implementation (subblocks, internal connections, footprint) here ``` -> While you can edit block definitions in the IDE, it must be part of a valid top-level design. -> It currently is not possible to set a non-BoardTop block as the top level. -> However, you can instantiate this block in your design, then double-click into it, and edit from there. -> -> If you want to instantiate the new block from the GUI, you will need to recompile first. -> -> IDE support for library construction is very limited. -> You currently can't create Blocks or insert Ports from the IDE. +> IDE support for graphical edit actions for library construction is very limited and is not recommended. > `__init__` is meant to define the interface of a block (all Ports and Parameters), while `contents` is meant to define the contents of a block (largely Blocks, connections, and constraints). > This split is not enforced (and there are cases where it is desirable to mix them into just `__init__`), but the main benefits of this are performance (avoid building the full design tree unnecessarily) and separation for readability. @@ -80,8 +76,8 @@ For `DigitalSource`, while we could write the parameters explicitly: ```python # DON'T DO THIS - BETTER STYLE BELOW self.vout = self.Port(DigitalSource( - voltage_out=(self.gnd.link().voltage.lower(), - self.vcc.link().voltage.upper()), + voltage=(self.gnd.link().voltage.lower(), + self.vcc.link().voltage.upper()), current_limits=(-9, 9)*mAmp, output_thresholds=(self.gnd.link().voltage.upper() + 0.2 * Volt, self.vcc.link().voltage.lower() - 0.3 * Volt) @@ -153,38 +149,6 @@ class Lf21215tmr_Device(FootprintBlock): > 3. Pinning: a dict associating a pin number to a port. > 4. Additional data like `mfr`, `part`, and `datasheet`, which is generated in the netlist and may eventually be used for BoM generation. -> If using the IDE, the footprint and pinning can be set from the KiCad panel. -> -> You will need to make sure the KiCad footprint directory is properly set. -> 1. Open up IntelliJ settings: main menu > File > Settings (Windows) or Main > Preferences (MacOS). -> 2. In the settings panel, go to Tools > EDG IDE. -> 3. Set the KiCad Footprint Directory. -> - On Windows, this may be: `C:\Program Files\KiCad\6.0\share\kicad\footprints` -> - On MacOS, this may be: `/Applications/KiCad/KiCad.app/Contents/SharedSupport/footprints` -> 4. Restart the IDE. -> -> To set the footprint from the GUI: -> 1. Switch to the KiCad tab (from the Library Browser). -> 2. Select the corresponding block in the block diagram. -> - Remember that GUI edits are only allowed on blocks that are part of the current top-level design. -> You may need to instantiate your block to be able to set a footprint from the GUI. -> 3. Position the caret where you want to insert the code, such as inside `def contents()` -> 4. Search for the footprint you want to use, in this case `Package_TO_SOT_SMD.pretty:SOT-23.kicad_mod` -> 5. Double-click the footprint entry to insert the code. -> - If the caret is in an existing `self.footprint` call, it will be edited to use the new footprint -> 6. At this point, you have an empty `footprint(...)` call. -> Fill in the manufacturer, part number, and datasheet URL fields as follows: -> - Manufacturer: `Littelfuse` -> - Part: `LF21215TMR` -> - Datasheet: `https://www.littelfuse.com/~/media/electronics/datasheets/magnetic_sensors_and_reed_switches/littelfuse_tmr_switch_lf21215tmr_datasheet.pdf.pdf` -> 7. Double-click on the footprint pins to set the ports. -> Here, assign as follows: -> - Pin 1: `vcc` -> - Pin 2: `vout` -> - Pin 3: `gnd` -> -> ![KiCad tab](docs/ide/ide_kicad_magsense.png) - >
> At this point, your HDL might look like... > @@ -230,10 +194,6 @@ Since this won't be a footprint, it should extend `Block` directly, and you can > In contrast to definition we just wrote, this drops the `_Device` postfix we used to indicate a footprint block. - - - - As indicated by the application circuit, this block would have the same ports as the device (two **VoltageSink** and one **DigitalSource**). It would have two parts, the `Lf21215tmr_Device` we just defined, and a `DecouplingCapacitor`. **Instantiate them both, then connect them together**. ```python @@ -244,7 +204,7 @@ class Lf21215tmr(Block): self.cap = self.Block(DecouplingCapacitor(capacitance=0.1*uFarad(tol=0.2))) ``` -> Our design model requires a tolerance for all parts. +> The design model requires a tolerance for all parts. > We've chosen a default loose 20% tolerance for decoupling capacitors. For the ports, because these are intermediate ports, they must not have parameters (be `empty()`). From a2cc8b0f6572e6b8efd46d583a1b0a9352800d44 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sun, 28 Jun 2026 16:49:18 -0700 Subject: [PATCH 20/41] updates --- getting_started_advanced.md | 70 +++++++++---------------------------- getting_started_library.md | 44 ----------------------- 2 files changed, 16 insertions(+), 98 deletions(-) diff --git a/getting_started_advanced.md b/getting_started_advanced.md index c3a87aaa4..df70ef2b5 100644 --- a/getting_started_advanced.md +++ b/getting_started_advanced.md @@ -57,23 +57,18 @@ First, we'll need to define the block such that it can take a parameter. This is actually only slight twist on the naive approach: ```python class LedArray(Block): - @init_in_parent def __init__(self, count: IntLike) -> None: super().__init__() ``` Instead of the constructor argument being a Python type that defines a value like `int`, we use an expression-type. This defines the type of the parameter being passed but not the value. -`@init_in_parent` is needed whenever a Block defines constructor parameters. > The expression type is a way to refer to the parameter but without giving it a concrete value. > This is needed since the value is resolved in the compiler and therefore not available in the HDL to the constructor. > > Note that the type is not `IntExpr`, but `IntLike`, which also includes `int`. > This allows calling the constructor with an `int` value directly, if we just have a static parameterization. -> However, because of the required `@init_in_parent`, the actual value seem by the constructor will be a new `IntExpr`. -> -> `@init_in_parent` does some processing on the function itself, for example inspecting the constructor argument list and turning those into parameters, and translating the values passed in from the constructor call into references to the block's own parameters. ### Port Arrays - Definition @@ -110,15 +105,20 @@ class LedArray(GeneratorBlock): super().__init__() self.ios = self.Port(Vector(DigitalSink.empty()), [Input]) self.gnd = self.Port(Ground.empty(), [Common]) - self.generator(self.generate, count) + self.count = self.ArgParameter(count) + self.generator_param(self.count) - def generate(self, count: int) -> None: + def generate(self) -> None: + super().generate() ... ``` > While here we use generators as a way to get a concrete value for circuit generation (the LED count), generators can also be used to do calculations beyond the operations available with the parameters. > For example, while we can add two `IntExpr`s (which produces another `IntExpr`), something more complex like square root is not provided. -> For those cases, use a generator to get the parameter's value, where you have access to the full power of Python. +> For those cases, use a generator to get the parameter's concrete value, where you have access to the full power of Python. +> +> Generator parameters must be explicitly defined using `self.generator_param(...)`. +> Within `generate`, you can get the concrete value of a generator parameter using `self.get(...)`. ### Port Arrays - Internal So far, the port array is still empty, so we must define its elements. @@ -126,8 +126,9 @@ With the count available as an int, we can use the `for` loop structure from bef ```python class LedArray(GeneratorBlock): ... - def generate(self, count: int) -> None: - for i in range(count): + def generate(self) -> None: + super().generate() + for i in range(self.get(self.count)): self.ios.append_elt(DigitalSink.empty()) ... ``` @@ -158,11 +159,13 @@ Instantiate the LEDs and connect them to the IO pin and ground as needed. > super().__init__() > self.ios = self.Port(Vector(DigitalSink.empty()), [Input]) > self.gnd = self.Port(Ground.empty(), [Common]) -> self.generator(self.generate, count) +> self.count = self.ArgParameter(count) +> self.generator_param(self.count) > -> def generate(self, count: int) -> None: +> def generate(self) -> None: +> super().generate() > self.led = ElementDict[IndicatorLed]() -> for i in range(count): +> for i in range(self.get(self.count)): > io = self.ios.append_elt(DigitalSink.empty()) > self.led[i] = self.Block(IndicatorLed()) > self.connect(io, self.led[i].signal) @@ -232,47 +235,6 @@ class BlinkyExample(SimpleBoardTop): ``` ->
-> At this point, your HDL might look like... -> -> ```python -> class BlinkyExample(SimpleBoardTop): -> def contents(self) -> None: -> super().contents() -> self.usb = self.Block(UsbCReceptacle()) -> self.buck = self.Block(BuckConverter(3.3*Volt(tol=0.05))) -> self.connect(self.usb.gnd, self.buck.gnd) -> self.connect(self.usb.pwr, self.buck.pwr_in) -> -> with self.implicit_connect( -> ImplicitConnect(self.buck.pwr_out, [Power]), -> ImplicitConnect(self.buck.gnd, [Common]), -> ) as imp: -> self.mcu = imp.Block(IoController()) -> -> (self.sw, ), _ = self.chain(imp.Block(DigitalSwitch()), self.mcu.gpio.request('sw')) -> -> (self.led, ), _ = self.chain(self.mcu.gpio.request_vector('led'), imp.Block(LedArray(4))) -> -> # optionally, you may have also instantiated your magnetic sensor -> -> def refinements(self) -> Refinements: -> return super().refinements() + Refinements( -> instance_refinements=[ -> (['buck'], Tps561201), -> (['mcu'], Esp32_Wroom_32), -> ], -> instance_values=[ -> (['mcu', 'pin_assigns'], [ -> 'led_0=26', -> 'led_1=27', -> 'led_2=28', -> 'led_3=29', -> ]) -> ]) -> ``` ->
- ## Board Optimization diff --git a/getting_started_library.md b/getting_started_library.md index 69d380689..9e5e1809f 100644 --- a/getting_started_library.md +++ b/getting_started_library.md @@ -309,50 +309,6 @@ class BlinkyExample(SimpleBoardTop): self.connect(self.mcu.gpio.request('mag'), self.mag.out) ``` ->
-> At this point, your HDL might look like... -> -> ```python -> class BlinkyExample(SimpleBoardTop): -> def contents(self) -> None: -> super().contents() -> self.usb = self.Block(UsbCReceptacle()) -> self.buck = self.Block(BuckConverter(3.3*Volt(tol=0.05))) -> self.connect(self.usb.gnd, self.buck.gnd) -> self.connect(self.usb.pwr, self.buck.pwr_in) -> -> with self.implicit_connect( -> ImplicitConnect(self.buck.pwr_out, [Power]), -> ImplicitConnect(self.buck.gnd, [Common]), -> ) as imp: -> self.mcu = imp.Block(IoController()) -> -> (self.sw, ), _ = self.chain(imp.Block(DigitalSwitch()), self.mcu.gpio.request('sw')) -> -> self.led = ElementDict[IndicatorLed]() -> for i in range(4): -> (self.led[i], ), _ = self.chain(self.mcu.gpio.request(f'led{i}'), imp.Block(IndicatorLed())) -> -> self.mag = imp.Block(Lf21215tmr()) -> self.connect(self.mcu.gpio.request('mag'), self.mag.out) -> -> def refinements(self) -> Refinements: -> return super().refinements() + Refinements( -> instance_refinements=[ -> (['buck'], Tps561201), -> (['mcu'], Esp32_Wroom_32), -> ], -> instance_values=[ -> (['mcu', 'pin_assigns'], [ -> 'led0=26', -> 'led1=27', -> 'led2=28', -> 'led3=29', -> ]) -> ]) -> ``` ->
- ## Advanced Library Construction From 71d77da362379c565fb84e8869bd2176a03b989f Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Mon, 29 Jun 2026 01:16:10 -0700 Subject: [PATCH 21/41] Update figures --- docs/ide/ide_blinky_blocks.png | Bin 4103 -> 3845 bytes docs/ide/ide_blinky_connect.png | Bin 4397 -> 4589 bytes docs/ide/ide_connect_mcu_start.png | Bin 0 -> 3737 bytes docs/ide/ide_designhierarchy_switch.png | Bin 0 -> 11473 bytes docs/ide/ide_library_xiao.png | Bin 0 -> 8964 bytes docs/ide/ide_livetemplate_gnd_connect.png | Bin 31966 -> 17952 bytes docs/ide/ide_livetemplate_mcu.png | Bin 0 -> 11663 bytes docs/ide/ide_livetemplate_mcu_named.png | Bin 0 -> 12053 bytes docs/ide/ide_refine_switch.png | Bin 0 -> 20590 bytes docs/kicad_blinky.png | Bin 0 -> 23075 bytes docs/kicad_switchmatrix.png | Bin 0 -> 64358 bytes docs/kicad_switchmatrix_discrete.png | Bin 0 -> 118559 bytes docs/kicad_switchmatrix_refined.png | Bin 0 -> 72651 bytes edg/BoardTop.py | 1 + getting-started.md | 65 ++++++++++++---------- 15 files changed, 37 insertions(+), 29 deletions(-) create mode 100644 docs/ide/ide_connect_mcu_start.png create mode 100644 docs/ide/ide_designhierarchy_switch.png create mode 100644 docs/ide/ide_library_xiao.png create mode 100644 docs/ide/ide_livetemplate_mcu.png create mode 100644 docs/ide/ide_livetemplate_mcu_named.png create mode 100644 docs/ide/ide_refine_switch.png create mode 100644 docs/kicad_blinky.png create mode 100644 docs/kicad_switchmatrix.png create mode 100644 docs/kicad_switchmatrix_discrete.png create mode 100644 docs/kicad_switchmatrix_refined.png diff --git a/docs/ide/ide_blinky_blocks.png b/docs/ide/ide_blinky_blocks.png index 884475f41ed9da34f386043aedc3dda1a260ed8c..d3418b6cdd63fa94fc8dce8329acd2130e1677a9 100644 GIT binary patch literal 3845 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 SYoLFru>E@@_waWe&;K8|mNfkU literal 4103 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 WK55q*0=~w8jvo#3qka|l-M;~F`$(n$ literal 4397 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 E0EBb@-~a#s diff --git a/docs/ide/ide_connect_mcu_start.png b/docs/ide/ide_connect_mcu_start.png new file mode 100644 index 0000000000000000000000000000000000000000..a5a7c649e716d6f6c6026411768107a5678c3c37 GIT binary patch literal 3737 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 E7iuuqvH$=8 literal 0 HcmV?d00001 diff --git a/docs/ide/ide_designhierarchy_switch.png b/docs/ide/ide_designhierarchy_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..5631f7dd5933f48c8a3bfc57a07e36ce52a9d3fd GIT binary patch literal 11473 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 literal 0 HcmV?d00001 diff --git a/docs/ide/ide_livetemplate_gnd_connect.png b/docs/ide/ide_livetemplate_gnd_connect.png index c2a54689dbfb7ea9c51588a0ea65ba7cae250409..711ae0dbc158ae0ddc2e0db995deb9ed14c579ac 100644 GIT binary patch literal 17952 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 Og~8L+&t;ucLK6VoJ7nen literal 31966 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 literal 0 HcmV?d00001 diff --git a/docs/ide/ide_livetemplate_mcu_named.png b/docs/ide/ide_livetemplate_mcu_named.png new file mode 100644 index 0000000000000000000000000000000000000000..0375749bfddee2f864b5c327518a4b0feb60be24 GIT binary patch literal 12053 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 literal 0 HcmV?d00001 diff --git a/docs/ide/ide_refine_switch.png b/docs/ide/ide_refine_switch.png new file mode 100644 index 0000000000000000000000000000000000000000..f18ae579215ff5c3de1a1623efcd467a2b4e1c4f GIT binary patch literal 20590 zcma%iWmsHIx@}01#x=ORy9EtS;~E@-y9M{)ZjHMJ3-0btfZzmo*WiAeFW;Oyb7t;2 z_eVed^zPkVyQW<2`CXO!p zUyR>Kd@(k*aWJ!W)Kvw5e@cYMQAAmZXEh)1Z z6b347kpT!LEk+y#@?2z76=dQU6$R{1MS)6$WQhAA0=`PN4!+8^=L1lbDnNx4dJJ(* z$XBfb0<@d8StE%78xp9F)s^=%?R$4rae`iU&Q!k0w|*m=Fw$bfBMP{Jsd8ae+Q=ltP-@XZk6>R}_K z5IrL|uyF17h~T-XR(Od8Dn(0G5YTjp@KQio$WD`Y-ud`7Z8 zL?Z2tv0(1Ysd(?zR(LZW`*+e(bON??7*)M z;THWez;zmT65QvkKut>eUcJ57nf`4eym{&IthumHUXC`y6AX9%c?dwm7#Df&o`gRt zsy~w$u-e^}e+*zKvjQ;nzXXk=+nyUW!osM*ZzuI_ZCuBhM|5~cCJ~vOm0n?N_#u$8 z##gjoqHHS1VXJ6KxiNx}etF@^OPrDk+E6fYs9x(l@;pOrlI3Bi-391bUc;^ejxI&! z35CUqF?*O+K3{IC$?#8oj$Zm{B6oX!N8rlB5xLuAd*wxPd#r((20wa+Kq;~M zd8-Gj^=GEoZ`uoWxXp7^^gP@1>rHyy+9cvwh8pg@;HLCT?gcy#KVna0|9sO4#cF~y zuC!42_a=eYTm6%u^7gL71BQa($3*gt$2c5EtbPL;bVCL9C>ObPMUCpBa>28;14e4{ zS%c*S$FnglY{KJ#Ay*+QZ{K2StHS^uow0GgB*a88VZZ;y`vjO2jLD)w~*T#IVr-M*{{_@1e~4;cZ*kB4>K(>zhJ3j_dz ziX`%!baY2~MYP14W;OElqfRV7B`WpWt^y*t{#gB2qqwDn2EGKk^oZ;cF)KHja%6R7 zE~%$R=Eu>Vf5}BmK}7{91E`T23@oxCNm_f=?^YGCDfurPBqk4j;JH3tL%^YXSC4KI z1#JJu?zR2!?)ahOr)y{Ras8sa0*1bgvgnYZr#b(R@D--d{Iuc%!an=N8zMiXQ6KHq zeFhFH6>Ir6upCf(;&82ujWzCDwC0I*;o!8RzWE9vJ*->dYY>7@(IfT`weY-i?K9M#0uRxVhv#_&*lJ> zzDCCVLhkRHp^#U$$?l55mstV#kDS^Adjk)HYOpm*f-jO7$fJ6b;*W2)B?o6VMqSD3 znYM>1Kdtqt^K*upPF5w+n@$=wRB6PY5Y^%emZ|SF{?jg9fNG_lFtQ$`vjOab6ftF8 za(Ra;XrGvYP(k|g$F|sfS!3|>QXvLQI&s(VAs-W+(F~896slV|Cv7*D127*xIov&d z_*I~`IdSwzeq2Z^I%h{$E&QSC9%jAJx`CPX`+&Y&k=1cy#G$P%khWvzsKJroOYNqs zYK^SAv@R&%LS7)Jfjxl;`Q?4F0`lla(xm#plO1bRY2>V-JW7BqD--a64taByX)`&~ zE96l@Ur*r@bqPPUH@J!=BFd+;vK{k*%*rQ#eU_HfatsQ(v(w`C2u_2fIwrwc2MFW5LWwS$!i%T(&r-><_rMAY%nb&I9j^{^?tf*0kq< z^~5Pjb@OsM>U(NjLRrJ#PaY9o_kN}~0WIwKSN^ao6Wpx%f1!=xiVxESXZHJ$f3S<&wScJ~aY$c?8Zfm>bktxHxf|6+@*e)cIrZBCR&p5K_%pQiHLha&c8pjr z39IWjbGXY6=IUyk`pYPDnIKgDe;gHB~xO+VA>ii)= zS`Yf)fL%Y*hj?;0=*-~J_LlD)Q$8ro&aO^zQlyA_#^AOOFT(pVtk@LyC^oJLOu)TA zyeJ7!;IB3XC!A!)#!KKAd2-~E$iAXqfY!9l1O*0~%t(ADXSiH-+WNE;lPnA-kzBS3oSHxq)Q~Zssr-^(4;yNJ%_}xy}9|rdfSkDv{mG;j_8xM{w!1XB!6?sGC z%jaK~rt4U}@iNdL8Klsk2l)>5l>1bIZKWO`R| zXA6R8eIkhokqS=##^f_3_{*NOz!HM4 zk_a*B^>}ERaPgb!>wXoGai!19#mzZ zvFBXGyQuK#6TH_b3AMNp#e_ zuufc&w9-R;w=G4MkO%-*lBy^fr2zDo9(u3@+R!4V*-t~1olmnLG!a}Jm@K^sXZb|G z>V(SAP#BAy5SY4>HW-E(>L>t8EL>L!#}vb}8X1nOv8!r=;Xf|>d2ngg=8SKSx>Nl- zUq;((GDqUOn1n5p=68qKVWuYaS@gO?KFtN&HOVlLr9axxueqNkbL+YebUX{EYe(Y~ z1w3G*z(fNAE1rWc)>h?X*ohAzBBADg} zt`1!JEzeh3ayc7sZOGI?H!vBK2Bkr1&Bg_Fn-JLGOZ%sP3+&(gD8^fRK+tWOI0kz! zZi6fQ3xS6Zap3UMj4#DNQGQE~BX!ZzP3Xc}!6>`rg%D0TFr|s_3Y#%~F}f~DgIfrt zSJ=QsR+HXB4Qljr!Z0bT;*1MS)4AVZ_qD30U{~1{vzuEU$fZ?E|#4ggl4X0U%6E7n?zici) zF2*5l^s6$%;V%cArv~|t6shaO7%4@Bt-e11hVGeS%``-M<8SWgSwq?(20#pRH9cG= zB05up->!1o+VOvB8Oj{~0v`tWP!S+oa=OlYb`eZ8|0AuZpXnpLnO+Zw_#eF^k*rN8 z-I_)vCL@aSoUn_2tWAnt<-gCXQ?~vPCs&^ebjg%xz6}->Bgc>m%t3Uq;}Z&vkHg(N zP0+6~V^|EKR|$+4NiaKY4=K~H-vs#-zC}TMZCF{O4yf|1`0lWJ3 zaj^~Us#o7fm8!X<8fA1LH6}83hi;x|bO9Z@kCUVJiDNJ(2E3O6h3Ad==y0h&O`S#v zL?~Co95Q&)SBq;wxokk>jV^x}KL2-Kdy||wB}Re`1zBs$KY*N+^e(3 zB=pBw`xg-V7Y6R%1YLj1=aC2F%<=yUf9LK%B5qg6aoq@m%jNvg=Pn6=s<_lnL$Jy& zc+ggYiloc9LNZCM4xC{?LMZy37`Er_p!wDpmeQK)7$-@=FZhdy`faTQDSS{Z7f7Um z{BjAl9s*IjID@18&pL;w`TzssF-x6jUe^*rKVm-rIqB5V^gch%FC|476%thRCi4+F zdRYcjJ_{Dg$cLqEl1$f<+?s(0OIINC)wkyk<$?7#dBq3#Qc~kNwXJZe&iu``JESYL zF@7pKJxfSv zIA%TKJ9M-vq{SIc$M{pRc$O@Z$mpMFaUo8Y37Az#eNNC46eI$a-TU^v#$+2xC_M-4 zCpEFPPOSsWjYU)IOPuCF_+y#QX32e1Q@jT-b~0b}G!s7GExtl$HgPNDIlsCcaMj9e zBQH|x)bv3;^~&3FDS_QTp{hLCX;yf$HNqx$ua|>;)l$TC^^IeyK|UU7Qz?_#N6Q

Z($--JU>y60?Bw9OR>9Pj0(vzFE_xvNp2HrSYi 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%0A3< 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 literal 0 HcmV?d00001 diff --git a/docs/kicad_blinky.png b/docs/kicad_blinky.png new file mode 100644 index 0000000000000000000000000000000000000000..e8f50b3b7691b5c6c5059a696fbf47767f715832 GIT binary patch literal 23075 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 HaEtjLlV~&p literal 0 HcmV?d00001 diff --git a/docs/kicad_switchmatrix.png b/docs/kicad_switchmatrix.png new file mode 100644 index 0000000000000000000000000000000000000000..60d2d58b74a339febf879c23a966d002cae6e4e7 GIT binary patch literal 64358 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�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%0A|J5~ua)fg60iabgyaiZS8%^eP>48PBO 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 G*#7|QC{$bk literal 0 HcmV?d00001 diff --git a/docs/kicad_switchmatrix_refined.png b/docs/kicad_switchmatrix_refined.png new file mode 100644 index 0000000000000000000000000000000000000000..180e8d5bf8047b0a96f4259ae3e75d28184dbf8b GIT binary patch literal 72651 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 C5~5T9 literal 0 HcmV?d00001 diff --git a/edg/BoardTop.py b/edg/BoardTop.py index 5b29db04d..66503c7f6 100644 --- a/edg/BoardTop.py +++ b/edg/BoardTop.py @@ -99,6 +99,7 @@ def refinements(self) -> Refinements: (Diode, JlcDiode), (Bjt, JlcBjt), (Fet, JlcFet), + (LinearRegulator, Ams1117), (Antenna, JlcAntenna), (Fpc050Bottom, Afc01), (Fpc050Top, Afc07Top), diff --git a/getting-started.md b/getting-started.md index c2ebb457e..5010da7c0 100644 --- a/getting-started.md +++ b/getting-started.md @@ -145,6 +145,8 @@ Try building the example now. Using interpreter from configured SDK [...] [... lots of compilation output here ...] Completed: generate netlist: wrote [...] + Completed: generate BOM: write [...] + Done ``` 4. Some options (like where the netlist is generated into) can be modified via the run options at the top right: ![run menu](docs/ide/ide_run_config.png) @@ -166,7 +168,7 @@ For this simple example, we connect an LED to a self-powered Xiao Rp2040 microco Let's start by instantiating the USB type-C receptacle through graphical operations in the IDE. 1. In the Library Browser, search for the block (here, `Xiao_Rp2040`) using the Filter textbox: - ![Library filtering by USB](docs/ide/ide_library_usbc.png) + ![Library filtering by xiao](docs/ide/ide_library_xiao.png) > The library icons have these meanings: > - ![Folder](docs/intellij_icons/AllIcons.Nodes.Folder.svg) (category): this "block" is actually a category organizer and cannot be instantiated. @@ -175,11 +177,11 @@ Let's start by instantiating the USB type-C receptacle through graphical operati 2. Double-click the library entry. This will insert the code to instantiate the block as a _live template_, code with template fields you can fill in: - ![Live template example](docs/ide/ide_livetemplate_usbc.png) + ![Live template example](docs/ide/ide_livetemplate_mcu.png) **Editing outside the currently active template field (boxed in blue) will break off and cancel the template.** **Moving the cursor outside the currently active template field, either using the mouse or keyboard arrows, is discouraged.** -3. Name the block `usb`, by typing it into the first template field. - ![Live template example](docs/ide/ide_livetemplate_usbc_named.png) +3. Name the block `mcu`, by typing it into the first template field. + ![Live template example](docs/ide/ide_livetemplate_mcu_named.png) 4. Then press [Tab] through the end of the template (leaving the other fields empty, they're optional). 5. Once you commit the live template, the block will appear in the block diagram visualizer. - The hatched pattern (diagonal lines) in the block diagram visualizer indicates that the block may be out-of-sync with the code until the next re-compile. @@ -215,7 +217,7 @@ First, we need to connect the power and ground between the devices. **Make these changes** to the `contents` method: ```diff - def contents() -> None: + def contents(self) -> None: super().contents() self.mcu = self.Block(Xiao_Rp2040()) self.led = self.Block(IndicatorLed()) @@ -227,8 +229,7 @@ First, we need to connect the power and ground between the devices. 1. Double click any of the ground ports (say, `mcu.gnd`). This starts a connection operation, which dims out the ports that cannot be connected: ![Connection beginning](docs/ide/ide_connect_usbc_start.png) -2. Select (single click) on all the other ground ports to be connected (here, just `led.gnd`): - ![Connection with ports](docs/ide/ide_connect_usbc_all.png) +2. Select (single click) the other ports to be connected (here, just `led.gnd`). 3. Double-click anywhere (within a block) to complete and insert the connections as a live template. ![Connection live template](docs/ide/ide_livetemplate_gnd_connect.png) > - Double-click on a port to simultaneously select that port and complete and insert the connection. @@ -242,14 +243,11 @@ First, we need to connect the power and ground between the devices. `self.connect(...)` connects all the argument ports together. Connections are strongly typed based on the port types: the system will try to infer a _link_ based on the argument port types and count. -If using the IDE: the compiled block diagram should look like: -![Block diagrams with power connections](docs/ide/ide_blinky_connectpower.png) - Then, we need to connect the LED to a GPIO on the microcontroller. Make these changes to the `contents` method: ```diff - def contents() -> None: + def contents(self) -> None: super().contents() self.mcu = self.Block(Xiao_Rp2040()) self.led = self.Block(IndicatorLed()) @@ -262,6 +260,8 @@ Make these changes to the `contents` method: 1. **Repeat the previous connect process**, but with `mcu.gpio` to `led.signal`. The microcontroller GPIO port ![port array symbol](docs/ide/ide_portarray.png) looks different as it is a dynamically sized port array. Connections into it ![port array symbol](docs/ide/ide_portarray_slice_min.png) `request(...)` a new element from the array. + + Graphical port array connect operations are buggy. 2. Give the GPIO pin an (optional) name `led` by modifying the generated code: ```diff - self.connect(self.mcu.gpio.request(), self.led.signal) @@ -301,7 +301,7 @@ Don't worry about installing it, in a few sections this will be replaced with a In the KiCad standalone PCB Editor (layout tool), go to File > Import > Netlist..., and open the netlist file generated. KiCad will produce an initial placement that roughly clusters components according to their hierarchical grouping: -![Blinky layout with default placement](docs/blinky_kicad.png) +![Blinky layout with default placement](docs/kicad_blinky.png) The generated netlist preserves the design hierarchy. This works with KiCad 10+'s native design blocks feature (which is somewhat heavyweight) as well as the [Sublayout plugin](https://github.com/ducky64/sublayout) (more lightweight and limited). @@ -322,7 +322,7 @@ __Now, we'll add a 3x2 switch matrix with just a few lines of code, this is wher **Make these changes** to the `contents` method: ```diff - def contents() -> None: + def contents(self) -> None: super().contents() self.mcu = self.Block(Xiao_Rp2040()) self.led = self.Block(IndicatorLed()) @@ -334,11 +334,7 @@ __Now, we'll add a 3x2 switch matrix with just a few lines of code, this is wher + self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) ``` -

Alternatively, with IDE graphical edit actions - -TODO Write Me - -
+Array-array connect operations are not supported with graphical edit actions. `SwitchMatrix` is a generator block that takes the number of columns (width) and rows (height) as parameters and generates the switch matrix (including diodes for multi-key detection). For keyboard enthusiasts, this generates COL2ROW circuits. @@ -350,7 +346,7 @@ Port arrays can be connected to other arrays, forming a parallel connection. Here, we connect `cols` (and `rows`) to the microcontroller, using `request_vector(...)` to request a new GPIOs the size of the incoming connection. If we load the netlist into KiCad, we get this: -![Default SwitchMatrix Layout](docs/switchmatrix_kicad.png) +![Default SwitchMatrix Layout](docs/kicad_switchmatrix.png) ## Abstract Parts and Refinements @@ -364,7 +360,6 @@ Internally, SwitchMatrix uses the abstract `Switch` block, and `SimpleBoardTop` def contents(self) -> None: ... -+ @override + def refinements(self) -> Refinements: + return super().refinements() + Refinements( + class_refinements=[ @@ -377,8 +372,10 @@ Internally, SwitchMatrix uses the abstract `Switch` block, and `SimpleBoardTop` 1. **Navigate into the switch in the switch matrix hierarchy and select it**. It is currently refined to a JlcSwitch, the tactile 5.1mm switch that is part of the JLC basic parts library. + ![Switch design hierarchy](docs/ide/ide_designhierarchy_switch.png) 2. **In the library, search for KailhSocket**, then right-click it and select "Refine class Switch to KailhSocket" + ![KailhSocket refinement menu](docs/ide/ide_refine_switch.png)
@@ -387,7 +384,7 @@ Refinements allow specifying, at the top level, modifications across the design Here, we override the default Switch refinement to use a mechanical keyswitch socket. If we load the netlist into KiCad, we get more reasonable components: -![Refined SwitchMatrix Layout](docs/switchmatrix_refined_kicad.png) +![Refined SwitchMatrix Layout](docs/kicad_switchmatrix_refined.png) After finishing this tutorial, see the [hierarchical layout tutorial](getting_started_hierarchy_layout.md) for speeding up layout using hierarchical layout replication. @@ -403,7 +400,7 @@ Because blocks encapsulate their subcircuits, using a discrete microcontroller i **Make these changes** to the design: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: + def contents(self) -> None: super().contents() - self.mcu = self.Block(Xiao_Rp2040()) + self.mcu = self.Block(IoController()) @@ -415,7 +412,6 @@ Because blocks encapsulate their subcircuits, using a discrete microcontroller i self.connect(self.sw.cols, self.mcu.gpio.request_vector('cols')) self.connect(self.sw.rows, self.mcu.gpio.request_vector('rows')) - @override def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ @@ -439,7 +435,7 @@ We'll add in the USB type-C port that was previously part of the Xiao, and conne **Make these changes** to the `contents` method: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: + def contents(self) -> None: super().contents() + self.usb = self.Block(UsbCReceptacle()) @@ -463,7 +459,7 @@ We'll insert a simple linear regulator, a step-down voltage converter. **Make these changes** to the `contents` method: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: + def contents(self) -> None: super().contents() self.usb = self.Block(UsbCReceptacle()) @@ -491,7 +487,7 @@ Once we recompile, it should complete with no errors. If we load the netlist into KiCad, we get the discrete microcontroller and its bundles of capacitors. Because we used USB, the microcontroller subcircuit also automatically generated a crystal to meet USB timing requirements. -![Refined SwitchMatrix Layout](docs/switchmatrix_discrete_kicad.png) +![Refined SwitchMatrix Layout](docs/kicad_switchmatrix_discrete.png) After finishing this tutorial, see the [hierarchical layout tutorial](getting_started_hierarchy_layout.md) for speeding up layout by loading an existing microcontroller block layout. @@ -503,7 +499,7 @@ This is supported through **mixins**. **Make these changes** to the `contents` method: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: + def contents(self) -> None: super().contents() self.usb = self.Block(UsbCReceptacle()) @@ -534,6 +530,15 @@ This is supported through **mixins**. + self.connect(self.usb.pwr, self.npx_shift.pwr) + self.connect(self.mcu.gpio.request('npx'), self.npx_shift.input) + self.connect(self.npx_shift.output, sw_npx.npx_din) + + def refinements(self) -> Refinements: + return super().refinements() + Refinements( + class_refinements=[ + (IoController, Stm32f103_48), + (Switch, KailhSocket), ++ (Neopixel, Sk6812Mini_E), + ], + ) ``` Mixins are not supported with graphical edit actions. @@ -546,6 +551,8 @@ We have also added a buffer (`L74Ahct1g125`) to shift the 3.3v logic level of th The RGBs datasheet defines their input thresholds as incompatible with 3.3v and this will generate ERC errors without the buffer. Go ahead and try it! +We also add a refinement to use the SK6812-Mini-E, a through-board LED used on mechanical keyboards. + ## Implicit Connections _The code is starting to get a bit long and tedious. We'll refactor that using implicit scopes, a syntactic sugar construct, to make it shorter and more readable._ @@ -553,7 +560,7 @@ _The code is starting to get a bit long and tedious. We'll refactor that using i **Replace** the `contents` method: ```python class BlinkyExample(SimpleBoardTop): - def contents() -> None: + def contents(self) -> None: super().contents() self.usb = self.Block(UsbCReceptacle()) @@ -623,7 +630,7 @@ Let's arbitrarily choose pins 26-29 for the LEDs. **Add a pin assignment for the STM32 in the refinements section**: ```diff class BlinkyExample(SimpleBoardTop): - def contents() -> None: + def contents(self) -> None: ... def refinements(self) -> Refinements: From a25385ad9d37088f8c8624e364d4c56c1c347f4a Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Fri, 3 Jul 2026 01:03:53 -0700 Subject: [PATCH 22/41] blinky test cases from new tutorial --- examples/test_basickeyboard.py | 41 ----- examples/test_blinky.py | 290 +++++++++++++++++++++------------ getting-started.md | 4 +- 3 files changed, 189 insertions(+), 146 deletions(-) delete mode 100644 examples/test_basickeyboard.py diff --git a/examples/test_basickeyboard.py b/examples/test_basickeyboard.py deleted file mode 100644 index bbd85b4b0..000000000 --- a/examples/test_basickeyboard.py +++ /dev/null @@ -1,41 +0,0 @@ -""" -Simple mechanical keyboard example design, using a socketed dev board - -Relies on footprints from external libraries. -In the KiCad Plugin and Content Manager, install the Keyswitch Kicad Library, -also on GitHub here https://github.com/perigoso/keyswitch-kicad-library -The project is set up to reference the third party library as installed by the KiCad -Plugin Manager, it does not need to be in your global library table. -""" - -import unittest - -from typing_extensions import override - -from edg import * -from .util import run_test_board - - -class BasicKeyboard(SimpleBoardTop): - @override - def contents(self) -> None: - super().contents() - - self.mcu = self.Block(Xiao_Rp2040()) - - self.sw = self.Block(SwitchMatrix(nrows=3, ncols=2)) - self.connect(self.sw.cols, self.mcu.gpio.request_vector()) - self.connect(self.sw.rows, self.mcu.gpio.request_vector()) - - @override - def refinements(self) -> Refinements: - return super().refinements() + Refinements( - class_refinements=[ - (Switch, KailhSocket), - ], - ) - - -class BasicKeyboardTestCase(unittest.TestCase): - def test_design(self) -> None: - run_test_board(BasicKeyboard) diff --git a/examples/test_blinky.py b/examples/test_blinky.py index 32c8ef706..27064d251 100644 --- a/examples/test_blinky.py +++ b/examples/test_blinky.py @@ -16,154 +16,202 @@ def contents(self) -> None: self.src = self.Block(DummyDigitalSource()).connected(self.led.signal) +class TestBlinkyEmpty(SimpleBoardTop): + pass + + class TestBlinkyBasic(SimpleBoardTop): """The simplest circuit, a microcontroller dev board with a LED. This also tests the dev board wrapper concept.""" @override def contents(self) -> None: + super().contents() self.mcu = self.Block(Xiao_Rp2040()) self.led = self.Block(IndicatorLed()) - - self.connect(self.led.signal, self.mcu.gpio.request()) self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request("led"), self.led.signal) -class TestBlinkyEmpty(SimpleBoardTop): - pass - - -class TestBlinkyBasicBattery(SimpleBoardTop): - """The simplest circuit, a microcontroller dev board with a LED, powered from a battery""" +class TestBlinkySwitchMatrix(SimpleBoardTop): + """The simplest circuit, a microcontroller dev board with a LED. + This also tests the dev board wrapper concept.""" @override def contents(self) -> None: - self.bat = self.Block(AaBatteryStack(4)) + super().contents() self.mcu = self.Block(Xiao_Rp2040()) self.led = self.Block(IndicatorLed()) - - self.connect(self.mcu.pwr_vin, self.bat.pwr) - self.connect(self.mcu.gnd, self.bat.gnd) - self.connect(self.led.signal, self.mcu.gpio.request()) self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request("led"), self.led.signal) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector("cols")) + self.connect(self.sw.rows, self.mcu.gpio.request_vector("rows")) -class TestBlinkyIncomplete(SimpleBoardTop): + +class TestBlinkySwitchMatrixRefined(SimpleBoardTop): @override def contents(self) -> None: super().contents() - self.usb = self.Block(UsbCReceptacle()) - self.mcu = self.Block(Stm32f103_48()) + self.mcu = self.Block(Xiao_Rp2040()) self.led = self.Block(IndicatorLed()) - self.connect(self.usb.gnd, self.mcu.gnd, self.led.gnd) - self.connect(self.usb.pwr, self.mcu.pwr) + self.connect(self.mcu.gnd, self.led.gnd) self.connect(self.mcu.gpio.request("led"), self.led.signal) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector("cols")) + self.connect(self.sw.rows, self.mcu.gpio.request_vector("rows")) -class TestBlinkyRegulated(SimpleBoardTop): + @override + def refinements(self) -> Refinements: + return super().refinements() + Refinements( + class_refinements=[ + (Switch, KailhSocket), + ], + ) + + +class TestBlinkyIncomplete(SimpleBoardTop): @override def contents(self) -> None: super().contents() - self.usb = self.Block(UsbCReceptacle()) - self.reg = self.Block(VoltageRegulator(3.3 * Volt(tol=0.05))) - self.mcu = self.Block(Stm32f103_48()) + self.mcu = self.Block(IoController()) self.led = self.Block(IndicatorLed()) - self.connect(self.usb.gnd, self.reg.gnd, self.mcu.gnd, self.led.gnd) - self.connect(self.usb.pwr, self.reg.pwr_in) - self.connect(self.reg.pwr_out, self.mcu.pwr) + self.connect(self.mcu.gnd, self.led.gnd) self.connect(self.mcu.gpio.request("led"), self.led.signal) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector("cols")) + self.connect(self.sw.rows, self.mcu.gpio.request_vector("rows")) + + @override + def refinements(self) -> Refinements: + return super().refinements() + Refinements( + class_refinements=[ + (IoController, Stm32f103_48), + (Switch, KailhSocket), + ], + ) + -class TestBlinkyComplete(SimpleBoardTop): +class TestBlinkyInvalid(SimpleBoardTop): @override def contents(self) -> None: super().contents() + self.usb = self.Block(UsbCReceptacle()) - self.reg = self.Block(VoltageRegulator(3.3 * Volt(tol=0.05))) - self.mcu = self.Block(Stm32f103_48()) + + self.mcu = self.Block(IoController()) + self.connect(self.usb.gnd, self.mcu.gnd) + self.connect(self.usb.pwr, self.mcu.pwr) + self.connect(self.usb.usb, self.mcu.usb.request("usb")) + self.led = self.Block(IndicatorLed()) - self.connect(self.usb.gnd, self.reg.gnd, self.mcu.gnd, self.led.gnd) - self.connect(self.usb.pwr, self.reg.pwr_in) - self.connect(self.reg.pwr_out, self.mcu.pwr) + self.connect(self.mcu.gnd, self.led.gnd) self.connect(self.mcu.gpio.request("led"), self.led.signal) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector("cols")) + self.connect(self.sw.rows, self.mcu.gpio.request_vector("rows")) + @override def refinements(self) -> Refinements: return super().refinements() + Refinements( - instance_refinements=[ - (["reg"], Tps561201), - ] + class_refinements=[ + (IoController, Stm32f103_48), + (Switch, KailhSocket), + ], ) -class TestBlinkyExpanded(SimpleBoardTop): +class TestBlinkyRegulated(SimpleBoardTop): @override def contents(self) -> None: super().contents() + self.usb = self.Block(UsbCReceptacle()) - self.reg = self.Block(VoltageRegulator(3.3 * Volt(tol=0.05))) - self.mcu = self.Block(Stm32f103_48()) - self.connect(self.usb.gnd, self.reg.gnd, self.mcu.gnd) + + self.reg = self.Block(LinearRegulator(3.3 * Volt(tol=0.05))) + self.connect(self.usb.gnd, self.reg.gnd) self.connect(self.usb.pwr, self.reg.pwr_in) + + self.mcu = self.Block(IoController()) + self.connect(self.usb.gnd, self.mcu.gnd) self.connect(self.reg.pwr_out, self.mcu.pwr) + self.connect(self.usb.usb, self.mcu.usb.request("usb")) - self.sw = self.Block(DigitalSwitch()) - self.connect(self.mcu.gpio.request("sw"), self.sw.out) - self.connect(self.usb.gnd, self.sw.gnd) + self.led = self.Block(IndicatorLed()) + self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request("led"), self.led.signal) - self.led = ElementDict[IndicatorLed]() - for i in range(4): - self.led[i] = self.Block(IndicatorLed()) - self.connect(self.mcu.gpio.request(f"led{i}"), self.led[i].signal) - self.connect(self.usb.gnd, self.led[i].gnd) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector("cols")) + self.connect(self.sw.rows, self.mcu.gpio.request_vector("rows")) @override def refinements(self) -> Refinements: return super().refinements() + Refinements( - instance_refinements=[ - (["reg"], Tps561201), - ] + class_refinements=[ + (IoController, Stm32f103_48), + (Switch, KailhSocket), + ], ) -class TestBlinkyImplicit(SimpleBoardTop): +class TestBlinkyRgb(SimpleBoardTop): @override def contents(self) -> None: super().contents() + self.usb = self.Block(UsbCReceptacle()) - self.reg = self.Block(VoltageRegulator(3.3 * Volt(tol=0.05))) + + self.reg = self.Block(LinearRegulator(3.3 * Volt(tol=0.05))) self.connect(self.usb.gnd, self.reg.gnd) self.connect(self.usb.pwr, self.reg.pwr_in) - with self.implicit_connect( - ImplicitConnect(self.reg.pwr_out, [Power]), - ImplicitConnect(self.reg.gnd, [Common]), - ) as imp: - self.mcu = imp.Block(Stm32f103_48()) + self.mcu = self.Block(IoController()) + self.connect(self.usb.gnd, self.mcu.gnd) + self.connect(self.reg.pwr_out, self.mcu.pwr) + self.connect(self.usb.usb, self.mcu.usb.request("usb")) - self.sw = imp.Block(DigitalSwitch()) - self.connect(self.mcu.gpio.request("sw"), self.sw.out) + self.led = self.Block(IndicatorLed()) + self.connect(self.mcu.gnd, self.led.gnd) + self.connect(self.mcu.gpio.request("led"), self.led.signal) - self.led = ElementDict[IndicatorLed]() - for i in range(4): - self.led[i] = imp.Block(IndicatorLed()) - self.connect(self.mcu.gpio.request(f"led{i}"), self.led[i].signal) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector("cols")) + self.connect(self.sw.rows, self.mcu.gpio.request_vector("rows")) + + sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels(npx_order="row_snake")) + self.connect(self.usb.gnd, sw_npx.npx_gnd) + self.connect(self.usb.pwr, sw_npx.npx_pwr) + + self.npx_shift = self.Block(L74Ahct1g125()) + self.connect(self.usb.gnd, self.npx_shift.gnd) + self.connect(self.usb.pwr, self.npx_shift.pwr) + self.connect(self.mcu.gpio.request("npx"), self.npx_shift.input) + self.connect(self.npx_shift.output, sw_npx.npx_din) @override def refinements(self) -> Refinements: return super().refinements() + Refinements( - instance_refinements=[ - (["reg"], Tps561201), - ] + class_refinements=[ + (IoController, Stm32f103_48), + (Switch, KailhSocket), + (Neopixel, Sk6812Mini_E), + ], ) -class TestBlinkyChain(SimpleBoardTop): +class TestBlinkyImplicit(SimpleBoardTop): @override def contents(self) -> None: super().contents() + self.usb = self.Block(UsbCReceptacle()) - self.reg = self.Block(VoltageRegulator(3.3 * Volt(tol=0.05))) + + self.reg = self.Block(LinearRegulator(3.3 * Volt(tol=0.05))) self.connect(self.usb.gnd, self.reg.gnd) self.connect(self.usb.pwr, self.reg.pwr_in) @@ -171,29 +219,47 @@ def contents(self) -> None: ImplicitConnect(self.reg.pwr_out, [Power]), ImplicitConnect(self.reg.gnd, [Common]), ) as imp: - self.mcu = imp.Block(Stm32f103_48()) + self.mcu = imp.Block(IoController()) + self.connect(self.usb.usb, self.mcu.usb.request("usb")) - (self.sw,), _ = self.chain(imp.Block(DigitalSwitch()), self.mcu.gpio.request("sw")) + self.led = imp.Block(IndicatorLed()) + self.connect(self.mcu.gpio.request("led"), self.led.signal) - self.led = ElementDict[IndicatorLed]() - for i in range(4): - (self.led[i],), _ = self.chain(self.mcu.gpio.request(f"led{i}"), imp.Block(IndicatorLed())) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector("cols")) + self.connect(self.sw.rows, self.mcu.gpio.request_vector("rows")) + + with self.implicit_connect( + ImplicitConnect(self.usb.pwr, [Power]), + ImplicitConnect(self.usb.gnd, [Common]), + ) as imp: + sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels(npx_order="row_snake")) + self.connect(self.usb.gnd, sw_npx.npx_gnd) + self.connect(self.usb.pwr, sw_npx.npx_pwr) + + self.npx_shift = imp.Block(L74Ahct1g125()) + self.connect(self.mcu.gpio.request("npx"), self.npx_shift.input) + self.connect(self.npx_shift.output, sw_npx.npx_din) @override def refinements(self) -> Refinements: return super().refinements() + Refinements( - instance_refinements=[ - (["reg"], Tps561201), - ] + class_refinements=[ + (IoController, Stm32f103_48), + (Switch, KailhSocket), + (Neopixel, Sk6812Mini_E), + ], ) -class TestBlinkyMicro(SimpleBoardTop): +class TestBlinkyPinned(SimpleBoardTop): @override def contents(self) -> None: super().contents() + self.usb = self.Block(UsbCReceptacle()) - self.reg = self.Block(VoltageRegulator(3.3 * Volt(tol=0.05))) + + self.reg = self.Block(LinearRegulator(3.3 * Volt(tol=0.05))) self.connect(self.usb.gnd, self.reg.gnd) self.connect(self.usb.pwr, self.reg.pwr_in) @@ -202,28 +268,45 @@ def contents(self) -> None: ImplicitConnect(self.reg.gnd, [Common]), ) as imp: self.mcu = imp.Block(IoController()) + self.connect(self.usb.usb, self.mcu.usb.request("usb")) - (self.sw,), _ = self.chain(imp.Block(DigitalSwitch()), self.mcu.gpio.request("sw")) + self.led = imp.Block(IndicatorLed()) + self.connect(self.mcu.gpio.request("led"), self.led.signal) - self.led = ElementDict[IndicatorLed]() - for i in range(4): - (self.led[i],), _ = self.chain(self.mcu.gpio.request(f"led{i}"), imp.Block(IndicatorLed())) + self.sw = self.Block(SwitchMatrix(ncols=2, nrows=3)) + self.connect(self.sw.cols, self.mcu.gpio.request_vector("cols")) + self.connect(self.sw.rows, self.mcu.gpio.request_vector("rows")) + + with self.implicit_connect( + ImplicitConnect(self.usb.pwr, [Power]), + ImplicitConnect(self.usb.gnd, [Common]), + ) as imp: + sw_npx = self.sw.with_mixin(SwitchMatrixNeopixels(npx_order="row_snake")) + self.connect(self.usb.gnd, sw_npx.npx_gnd) + self.connect(self.usb.pwr, sw_npx.npx_pwr) + + self.npx_shift = imp.Block(L74Ahct1g125()) + self.connect(self.mcu.gpio.request("npx"), self.npx_shift.input) + self.connect(self.npx_shift.output, sw_npx.npx_din) @override def refinements(self) -> Refinements: return super().refinements() + Refinements( - instance_refinements=[ - (["reg"], Tps561201), - (["mcu"], Esp32_Wroom_32), + class_refinements=[ + (IoController, Stm32f103_48), + (Switch, KailhSocket), + (Neopixel, Sk6812Mini_E), ], instance_values=[ ( ["mcu", "pin_assigns"], [ - "led0=26", - "led1=27", - "led2=28", - "led3=29", + "led=10", + "sw_col_0=16", + "sw_col_1=17", + "sw_col_2=18", + "sw_row_0=19", + "sw_row_1=20", ], ) ], @@ -625,37 +708,38 @@ class BlinkyTestCase(unittest.TestCase): def test_led(self) -> None: run_test_board(TestLed) - def test_design_basic(self) -> None: - run_test_board(TestBlinkyBasic) # generate this netlist as a test - def test_design_empty(self) -> None: run_test_board(TestBlinkyEmpty) - def test_design_battery(self) -> None: - run_test_board(TestBlinkyBasicBattery) + def test_design_basic(self) -> None: + run_test_board(TestBlinkyBasic) + + def test_design_switchmatrix(self) -> None: + run_test_board(TestBlinkySwitchMatrix) + + def test_design_switchmatrix_refined(self) -> None: + run_test_board(TestBlinkySwitchMatrixRefined) def test_design_incomplete(self) -> None: with self.assertRaises(CompilerCheckError): compile_board_inplace(TestBlinkyIncomplete, False) + def test_design_invalid(self) -> None: + with self.assertRaises(CompilerCheckError): + compile_board_inplace(TestBlinkyInvalid, False) + def test_design_regulated(self) -> None: with self.assertRaises(CompilerCheckError): compile_board_inplace(TestBlinkyRegulated, False) - def test_design_complete(self) -> None: - run_test_board(TestBlinkyComplete) - - def test_design_expnaded(self) -> None: - run_test_board(TestBlinkyExpanded) + def test_design_rgb(self) -> None: + run_test_board(TestBlinkyRgb) def test_design_implicit(self) -> None: run_test_board(TestBlinkyImplicit) - def test_design_chain(self) -> None: - run_test_board(TestBlinkyChain) # generate this netlist as a test - - def test_design_micro(self) -> None: - run_test_board(TestBlinkyMicro) + def test_design_pinned(self) -> None: + run_test_board(TestBlinkyPinned) def test_design_library(self) -> None: run_test_board(TestBlinkyWithLibrary) diff --git a/getting-started.md b/getting-started.md index 5010da7c0..8ff07ed99 100644 --- a/getting-started.md +++ b/getting-started.md @@ -642,8 +642,8 @@ Let's arbitrarily choose pins 26-29 for the LEDs. + 'sw_col_0=16', + 'sw_col_1=17', + 'sw_col_2=18', -+ 'sw_row0=19', -+ 'sw_row1=20', ++ 'sw_row_0=19', ++ 'sw_row_1=20', + ]) ]) ``` From 8b5f1b7f0f26b96543add9d6969bd7c9eef8e1a1 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Fri, 3 Jul 2026 01:36:19 -0700 Subject: [PATCH 23/41] update netlists, remove _48 postfix from stm32f103 --- README.md | 2 +- edg/parts/human_interface/Neopixel.py | 2 +- edg/parts/microcontroller/Stm32f103.py | 8 +- edg/parts/microcontroller/__init__.py | 2 +- examples/RobotCrawler/RobotCrawler.net.ref | 16 +- examples/SwdDebugger/SwdDebugger.net.ref | 20 +- .../TestBlinkyBasicBattery.net.ref | 112 --- .../TestBlinkyBasicBattery.svgpcb.js | 88 -- .../TestBlinkyChain/TestBlinkyChain.net.ref | 464 ----------- .../TestBlinkyChain/TestBlinkyChain.svgpcb.js | 211 ----- .../TestBlinkyComplete.net.ref | 355 -------- .../TestBlinkyComplete.svgpcb.js | 169 ---- .../TestBlinkyExpanded.net.ref | 464 ----------- .../TestBlinkyExpanded.svgpcb.js | 211 ----- .../TestBlinkyImplicit.net.ref | 771 ++++++++++++------ .../TestBlinkyImplicit.svgpcb.js | 263 +++--- .../TestBlinkyMicro/TestBlinkyMicro.net.ref | 438 ---------- .../TestBlinkyMicro/TestBlinkyMicro.svgpcb.js | 204 ----- .../TestBlinkyPinned/TestBlinkyPinned.net.ref | 743 +++++++++++++++++ .../TestBlinkyPinned.svgpcb.js | 260 ++++++ .../TestBlinkyRegulated.net.ref | 523 ++++++++++++ .../TestBlinkyRegulated.svgpcb.js | 242 ++++++ examples/TestBlinkyRgb/TestBlinkyRgb.net.ref | 743 +++++++++++++++++ .../TestBlinkyRgb/TestBlinkyRgb.svgpcb.js | 260 ++++++ .../TestBlinkySwitchMatrix.net.ref | 237 ++++++ .../TestBlinkySwitchMatrix.svgpcb.js | 146 ++++ .../TestBlinkySwitchMatrixRefined.net.ref} | 109 ++- .../TestBlinkySwitchMatrixRefined.svgpcb.js} | 42 +- examples/TofArray/TofArray.net.ref | 18 +- examples/test_blinky.py | 25 +- examples/test_robotcrawler.py | 2 +- examples/test_swd_debugger.py | 2 +- examples/test_tofarray.py | 2 +- getting-started.md | 14 +- 34 files changed, 3991 insertions(+), 3177 deletions(-) delete mode 100644 examples/TestBlinkyBasicBattery/TestBlinkyBasicBattery.net.ref delete mode 100644 examples/TestBlinkyBasicBattery/TestBlinkyBasicBattery.svgpcb.js delete mode 100644 examples/TestBlinkyChain/TestBlinkyChain.net.ref delete mode 100644 examples/TestBlinkyChain/TestBlinkyChain.svgpcb.js delete mode 100644 examples/TestBlinkyComplete/TestBlinkyComplete.net.ref delete mode 100644 examples/TestBlinkyComplete/TestBlinkyComplete.svgpcb.js delete mode 100644 examples/TestBlinkyExpanded/TestBlinkyExpanded.net.ref delete mode 100644 examples/TestBlinkyExpanded/TestBlinkyExpanded.svgpcb.js delete mode 100644 examples/TestBlinkyMicro/TestBlinkyMicro.net.ref delete mode 100644 examples/TestBlinkyMicro/TestBlinkyMicro.svgpcb.js create mode 100644 examples/TestBlinkyPinned/TestBlinkyPinned.net.ref create mode 100644 examples/TestBlinkyPinned/TestBlinkyPinned.svgpcb.js create mode 100644 examples/TestBlinkyRegulated/TestBlinkyRegulated.net.ref create mode 100644 examples/TestBlinkyRegulated/TestBlinkyRegulated.svgpcb.js create mode 100644 examples/TestBlinkyRgb/TestBlinkyRgb.net.ref create mode 100644 examples/TestBlinkyRgb/TestBlinkyRgb.svgpcb.js create mode 100644 examples/TestBlinkySwitchMatrix/TestBlinkySwitchMatrix.net.ref create mode 100644 examples/TestBlinkySwitchMatrix/TestBlinkySwitchMatrix.svgpcb.js rename examples/{BasicKeyboard/BasicKeyboard.net.ref => TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.net.ref} (80%) rename examples/{BasicKeyboard/BasicKeyboard.svgpcb.js => TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.svgpcb.js} (70%) diff --git a/README.md b/README.md index d4b765bd0..62649af43 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ class Keyboard(SimpleBoardTop): ImplicitConnect(self.reg.pwr_out, [Power]), ImplicitConnect(self.reg.gnd, [Common]), ) as imp: - self.mcu = imp.Block(Stm32f103_48()) + self.mcu = imp.Block(Stm32f103()) self.connect(self.usb.usb, self.mcu.usb.request()) self.sw = self.Block(SwitchMatrix(nrows=3, ncols=2)) diff --git a/edg/parts/human_interface/Neopixel.py b/edg/parts/human_interface/Neopixel.py index 440ab6e97..cc67f92b4 100644 --- a/edg/parts/human_interface/Neopixel.py +++ b/edg/parts/human_interface/Neopixel.py @@ -21,7 +21,7 @@ def __init__(self) -> None: self.din.init_from( DigitalSink.from_supply( self.gnd, - self.vdd, + self.pwr, voltage_limit_tolerance=(-0.3, 0.7), input_threshold_abs=(0.7, 2.7), # note that a more restrictive input_threshold_abs of (1.5, 2.3) was used previously diff --git a/edg/parts/microcontroller/Stm32f103.py b/edg/parts/microcontroller/Stm32f103.py index 24a49f7ec..d5758be69 100644 --- a/edg/parts/microcontroller/Stm32f103.py +++ b/edg/parts/microcontroller/Stm32f103.py @@ -1,5 +1,6 @@ from typing import * +from deprecated import deprecated from typing_extensions import override from ...circuits import * @@ -255,7 +256,7 @@ def __init__(self, resistance: RangeLike): self.connect(self.usb.dp, self.dp.b) -class Stm32f103_48( +class Stm32f103( Resettable, IoControllerI2cTarget, IoControllerCan, @@ -323,3 +324,8 @@ def _crystal_required(self) -> bool: # crystal needed for CAN or USB b/c tighte or len(self.get(self.usb.requested())) > 0 or super()._crystal_required() ) + + +@deprecated("Use Stm32f103 instead of Stm32f103_48") +class Stm32f103_48(Stm32f103): + pass diff --git a/edg/parts/microcontroller/__init__.py b/edg/parts/microcontroller/__init__.py index a167dbf27..fb5391562 100644 --- a/edg/parts/microcontroller/__init__.py +++ b/edg/parts/microcontroller/__init__.py @@ -1,7 +1,7 @@ from .Ch32v003 import Ch32v003, Ch32vSdiHeader, Ch32vSdiHeader254, Ch32vSdiTc2030 from .Ch32v203 import Ch32v203, Ch32vSdi2Header, Ch32vSdi2Header254, Ch32vSdi2Tc2030 from .Lpc1549 import Lpc1549_48, Lpc1549_64 -from .Stm32f103 import Stm32f103_48 +from .Stm32f103 import Stm32f103, Stm32f103_48 from .Stm32f303 import Nucleo_F303k8 from .Stm32g031 import Stm32g031_G from .Stm32g431 import Stm32g431kb diff --git a/examples/RobotCrawler/RobotCrawler.net.ref b/examples/RobotCrawler/RobotCrawler.net.ref index 7299ee60b..f8cf83e23 100644 --- a/examples/RobotCrawler/RobotCrawler.net.ref +++ b/examples/RobotCrawler/RobotCrawler.net.ref @@ -580,7 +580,7 @@ (value "mcu_servo.ic") (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") (property (name "Sheetname") (value "mcu_servo")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu_servo.ic")) (property (name "edg_short_path") (value "mcu_servo.ic")) (property (name "edg_refdes") (value "RU7")) @@ -592,7 +592,7 @@ (value "mcu_servo.pwr_cap[0]") (footprint "Capacitor_SMD:C_0805_2012Metric") (property (name "Sheetname") (value "mcu_servo")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu_servo.pwr_cap[0].cap")) (property (name "edg_short_path") (value "mcu_servo.pwr_cap[0]")) (property (name "edg_refdes") (value "RC15")) @@ -604,7 +604,7 @@ (value "mcu_servo.pwr_cap[1]") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu_servo")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu_servo.pwr_cap[1].cap")) (property (name "edg_short_path") (value "mcu_servo.pwr_cap[1]")) (property (name "edg_refdes") (value "RC16")) @@ -616,7 +616,7 @@ (value "mcu_servo.pwr_cap[2]") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu_servo")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu_servo.pwr_cap[2].cap")) (property (name "edg_short_path") (value "mcu_servo.pwr_cap[2]")) (property (name "edg_refdes") (value "RC17")) @@ -628,7 +628,7 @@ (value "mcu_servo.pwr_cap[3]") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu_servo")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu_servo.pwr_cap[3].cap")) (property (name "edg_short_path") (value "mcu_servo.pwr_cap[3]")) (property (name "edg_refdes") (value "RC18")) @@ -640,7 +640,7 @@ (value "mcu_servo.vdda_cap_0") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu_servo")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu_servo.vdda_cap_0.cap")) (property (name "edg_short_path") (value "mcu_servo.vdda_cap_0")) (property (name "edg_refdes") (value "RC19")) @@ -652,7 +652,7 @@ (value "mcu_servo.vdda_cap_1") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu_servo")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu_servo.vdda_cap_1.cap")) (property (name "edg_short_path") (value "mcu_servo.vdda_cap_1")) (property (name "edg_refdes") (value "RC20")) @@ -664,7 +664,7 @@ (value "mcu_servo.swd") (footprint "Connector:Tag-Connect_TC2030-IDC-NL_2x03_P1.27mm_Vertical") (property (name "Sheetname") (value "mcu_servo")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu_servo.swd.conn")) (property (name "edg_short_path") (value "mcu_servo.swd")) (property (name "edg_refdes") (value "RJ17")) diff --git a/examples/SwdDebugger/SwdDebugger.net.ref b/examples/SwdDebugger/SwdDebugger.net.ref index 5b05af2c7..fafa8826a 100644 --- a/examples/SwdDebugger/SwdDebugger.net.ref +++ b/examples/SwdDebugger/SwdDebugger.net.ref @@ -160,7 +160,7 @@ (value "mcu.ic") (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.ic")) (property (name "edg_short_path") (value "mcu.ic")) (property (name "edg_refdes") (value "SU3")) @@ -172,7 +172,7 @@ (value "mcu.pwr_cap[0]") (footprint "Capacitor_SMD:C_0805_2012Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) (property (name "edg_refdes") (value "SC5")) @@ -184,7 +184,7 @@ (value "mcu.pwr_cap[1]") (footprint "Capacitor_SMD:C_0402_1005Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) (property (name "edg_refdes") (value "SC6")) @@ -196,7 +196,7 @@ (value "mcu.pwr_cap[2]") (footprint "Capacitor_SMD:C_0402_1005Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) (property (name "edg_refdes") (value "SC7")) @@ -208,7 +208,7 @@ (value "mcu.pwr_cap[3]") (footprint "Capacitor_SMD:C_0402_1005Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) (property (name "edg_refdes") (value "SC8")) @@ -220,7 +220,7 @@ (value "mcu.vdda_cap_0") (footprint "Capacitor_SMD:C_0402_1005Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) (property (name "edg_short_path") (value "mcu.vdda_cap_0")) (property (name "edg_refdes") (value "SC9")) @@ -232,7 +232,7 @@ (value "mcu.vdda_cap_1") (footprint "Capacitor_SMD:C_0402_1005Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) (property (name "edg_short_path") (value "mcu.vdda_cap_1")) (property (name "edg_refdes") (value "SC10")) @@ -244,7 +244,7 @@ (value "mcu.crystal") (footprint "Crystal:Resonator_SMD_Murata_CSTxExxV-3Pin_3.0x1.1mm") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.crystal")) (property (name "edg_short_path") (value "mcu.crystal")) (property (name "edg_refdes") (value "SU4")) @@ -256,7 +256,7 @@ (value "mcu.swd") (footprint "Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.swd.conn")) (property (name "edg_short_path") (value "mcu.swd")) (property (name "edg_refdes") (value "SJ2")) @@ -268,7 +268,7 @@ (value "mcu.usb_pull") (footprint "Resistor_SMD:R_0402_1005Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.usb_pull.dp")) (property (name "edg_short_path") (value "mcu.usb_pull")) (property (name "edg_refdes") (value "SR3")) diff --git a/examples/TestBlinkyBasicBattery/TestBlinkyBasicBattery.net.ref b/examples/TestBlinkyBasicBattery/TestBlinkyBasicBattery.net.ref deleted file mode 100644 index d6862010e..000000000 --- a/examples/TestBlinkyBasicBattery/TestBlinkyBasicBattery.net.ref +++ /dev/null @@ -1,112 +0,0 @@ -(export (version D) -(components -(comp (ref "U1") - (value "bat.cell[0]") - (footprint "Battery:BatteryHolder_Keystone_2460_1xAA") - (property (name "Sheetname") (value "bat")) - (property (name "Sheetfile") (value "edg.parts.power.Batteries.AaBatteryStack")) - (property (name "edg_path") (value "bat.cell[0]")) - (property (name "edg_short_path") (value "bat.cell[0]")) - (property (name "edg_refdes") (value "U1")) - (property (name "edg_part") (value "2460 (Keystone)")) - (property (name "edg_value") (value "2460")) - (sheetpath (names "/bat/") (tstamps "/025f0138/")) - (tstamps "0ab40289")) -(comp (ref "U2") - (value "bat.cell[1]") - (footprint "Battery:BatteryHolder_Keystone_2460_1xAA") - (property (name "Sheetname") (value "bat")) - (property (name "Sheetfile") (value "edg.parts.power.Batteries.AaBatteryStack")) - (property (name "edg_path") (value "bat.cell[1]")) - (property (name "edg_short_path") (value "bat.cell[1]")) - (property (name "edg_refdes") (value "U2")) - (property (name "edg_part") (value "2460 (Keystone)")) - (property (name "edg_value") (value "2460")) - (sheetpath (names "/bat/") (tstamps "/025f0138/")) - (tstamps "0ab6028a")) -(comp (ref "U3") - (value "bat.cell[2]") - (footprint "Battery:BatteryHolder_Keystone_2460_1xAA") - (property (name "Sheetname") (value "bat")) - (property (name "Sheetfile") (value "edg.parts.power.Batteries.AaBatteryStack")) - (property (name "edg_path") (value "bat.cell[2]")) - (property (name "edg_short_path") (value "bat.cell[2]")) - (property (name "edg_refdes") (value "U3")) - (property (name "edg_part") (value "2460 (Keystone)")) - (property (name "edg_value") (value "2460")) - (sheetpath (names "/bat/") (tstamps "/025f0138/")) - (tstamps "0ab8028b")) -(comp (ref "U4") - (value "bat.cell[3]") - (footprint "Battery:BatteryHolder_Keystone_2460_1xAA") - (property (name "Sheetname") (value "bat")) - (property (name "Sheetfile") (value "edg.parts.power.Batteries.AaBatteryStack")) - (property (name "edg_path") (value "bat.cell[3]")) - (property (name "edg_short_path") (value "bat.cell[3]")) - (property (name "edg_refdes") (value "U4")) - (property (name "edg_part") (value "2460 (Keystone)")) - (property (name "edg_value") (value "2460")) - (sheetpath (names "/bat/") (tstamps "/025f0138/")) - (tstamps "0aba028c")) -(comp (ref "U5") - (value "mcu") - (footprint "Seeed Studio XIAO Series Library:XIAO-RP2040-SMD") - (property (name "Sheetname") (value "")) - (property (name "Sheetfile") (value "")) - (property (name "edg_path") (value "mcu.device")) - (property (name "edg_short_path") (value "mcu")) - (property (name "edg_refdes") (value "U5")) - (property (name "edg_part") (value "XIAO RP2040")) - (property (name "edg_value") (value "XIAO RP2040")) - (sheetpath (names "/") (tstamps "/")) - (tstamps "02850146")) -(comp (ref "D1") - (value "led.package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led.package")) - (property (name "edg_short_path") (value "led.package")) - (property (name "edg_refdes") (value "D1")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led/") (tstamps "/02750136/")) - (tstamps "0b4e02cd")) -(comp (ref "R1") - (value "led.res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led.res")) - (property (name "edg_short_path") (value "led.res")) - (property (name "edg_refdes") (value "R1")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led/") (tstamps "/02750136/")) - (tstamps "0296014b"))) -(nets -(net (code 1) (name "bat.pwr") - (node (ref U4) (pin 1)) - (node (ref U5) (pin 14))) -(net (code 2) (name "bat.gnd") - (node (ref U1) (pin 2)) - (node (ref U5) (pin 13)) - (node (ref R1) (pin 2))) -(net (code 3) (name "bat.cell[0].pwr") - (node (ref U1) (pin 1)) - (node (ref U2) (pin 2))) -(net (code 4) (name "bat.cell[1].pwr") - (node (ref U2) (pin 1)) - (node (ref U3) (pin 2))) -(net (code 5) (name "bat.cell[2].pwr") - (node (ref U3) (pin 1)) - (node (ref U4) (pin 2))) -(net (code 6) (name "mcu.pwr_out") - (node (ref U5) (pin 12))) -(net (code 7) (name "led.signal") - (node (ref U5) (pin 7)) - (node (ref D1) (pin 2))) -(net (code 8) (name "led.package.k") - (node (ref D1) (pin 1)) - (node (ref R1) (pin 1)))) -) \ No newline at end of file diff --git a/examples/TestBlinkyBasicBattery/TestBlinkyBasicBattery.svgpcb.js b/examples/TestBlinkyBasicBattery/TestBlinkyBasicBattery.svgpcb.js deleted file mode 100644 index 81f790f12..000000000 --- a/examples/TestBlinkyBasicBattery/TestBlinkyBasicBattery.svgpcb.js +++ /dev/null @@ -1,88 +0,0 @@ -const board = new PCB(); - -// bat.cell[0] -const U1 = board.add(BatteryHolder_Keystone_2460_1xAA, { - translate: pt(0.108, 0.343), rotate: 0, - id: 'U1' -}) -// bat.cell[1] -const U2 = board.add(BatteryHolder_Keystone_2460_1xAA, { - translate: pt(0.108, 1.067), rotate: 0, - id: 'U2' -}) -// bat.cell[2] -const U3 = board.add(BatteryHolder_Keystone_2460_1xAA, { - translate: pt(0.108, 1.791), rotate: 0, - id: 'U3' -}) -// bat.cell[3] -const U4 = board.add(BatteryHolder_Keystone_2460_1xAA, { - translate: pt(0.108, 2.516), rotate: 0, - id: 'U4' -}) -// mcu.device -const U5 = board.add(XIAO_RP2040_SMD, { - translate: pt(2.730, 0.410), rotate: 0, - id: 'U5' -}) -// led.package -const D1 = board.add(LED_0603_1608Metric, { - translate: pt(3.258, 0.029), rotate: 0, - id: 'D1' -}) -// led.res -const R1 = board.add(R_0603_1608Metric, { - translate: pt(3.258, 0.126), rotate: 0, - id: 'R1' -}) - -board.setNetlist([ - {name: "bat.pwr", pads: [["U4", "1"], ["U5", "14"]]}, - {name: "bat.gnd", pads: [["U1", "2"], ["U5", "13"], ["R1", "2"]]}, - {name: "bat.cell[0].pwr", pads: [["U1", "1"], ["U2", "2"]]}, - {name: "bat.cell[1].pwr", pads: [["U2", "1"], ["U3", "2"]]}, - {name: "bat.cell[2].pwr", pads: [["U3", "1"], ["U4", "2"]]}, - {name: "mcu.pwr_out", pads: [["U5", "12"]]}, - {name: "led.signal", pads: [["U5", "7"], ["D1", "2"]]}, - {name: "led.package.k", pads: [["D1", "1"], ["R1", "1"]]} -]) - -const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(3.4348425196850396, 2.9763779527559056); -const xMin = Math.min(limit0[0], limit1[0]); -const xMax = Math.max(limit0[0], limit1[0]); -const yMin = Math.min(limit0[1], limit1[1]); -const yMax = Math.max(limit0[1], limit1[1]); - -const filletRadius = 0.1; -const outline = path( - [(xMin+xMax/2), yMax], - ["fillet", filletRadius, [xMax, yMax]], - ["fillet", filletRadius, [xMax, yMin]], - ["fillet", filletRadius, [xMin, yMin]], - ["fillet", filletRadius, [xMin, yMax]], - [(xMin+xMax/2), yMax], -); -board.addShape("outline", outline); - -renderPCB({ - pcb: board, - layerColors: { - "F.Paste": "#000000ff", - "F.Mask": "#000000ff", - "B.Mask": "#000000ff", - "componentLabels": "#00e5e5e5", - "outline": "#002d00ff", - "padLabels": "#ffff99e5", - "B.Cu": "#ef4e4eff", - "F.Cu": "#ff8c00cc", - }, - limits: { - x: [xMin, xMax], - y: [yMin, yMax] - }, - background: "#00000000", - mmPerUnit: 25.4 -}) - - diff --git a/examples/TestBlinkyChain/TestBlinkyChain.net.ref b/examples/TestBlinkyChain/TestBlinkyChain.net.ref deleted file mode 100644 index 21abf4314..000000000 --- a/examples/TestBlinkyChain/TestBlinkyChain.net.ref +++ /dev/null @@ -1,464 +0,0 @@ -(export (version D) -(components -(comp (ref "J1") - (value "usb.conn") - (footprint "Connector_USB:USB_C_Receptacle_XKB_U262-16XN-4BVC11") - (property (name "Sheetname") (value "usb")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCReceptacle")) - (property (name "edg_path") (value "usb.conn")) - (property (name "edg_short_path") (value "usb.conn")) - (property (name "edg_refdes") (value "J1")) - (property (name "edg_part") (value "COM-15111 (Sparkfun)")) - (property (name "edg_value") (value "COM-15111")) - (sheetpath (names "/usb/") (tstamps "/02aa014b/")) - (tstamps "042701af")) -(comp (ref "R1") - (value "usb.cc_pull.cc1") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "cc_pull")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) - (property (name "edg_path") (value "usb.cc_pull.cc1")) - (property (name "edg_short_path") (value "usb.cc_pull.cc1")) - (property (name "edg_refdes") (value "R1")) - (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) - (tstamps "022300f8")) -(comp (ref "R2") - (value "usb.cc_pull.cc2") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "cc_pull")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) - (property (name "edg_path") (value "usb.cc_pull.cc2")) - (property (name "edg_short_path") (value "usb.cc_pull.cc2")) - (property (name "edg_refdes") (value "R2")) - (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) - (tstamps "022400f9")) -(comp (ref "U1") - (value "reg.ic") - (footprint "Package_TO_SOT_SMD:SOT-23-6") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.ic")) - (property (name "edg_short_path") (value "reg.ic")) - (property (name "edg_refdes") (value "U1")) - (property (name "edg_part") (value "TPS561201 (Texas Instruments)")) - (property (name "edg_value") (value "TPS561201")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "013700cd")) -(comp (ref "R3") - (value "reg.fb.top_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.top_res")) - (property (name "edg_short_path") (value "reg.fb.top_res")) - (property (name "edg_refdes") (value "R3")) - (property (name "edg_part") (value "0603WAF3302T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 33kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "0c0c02fd")) -(comp (ref "R4") - (value "reg.fb.bottom_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.bottom_res")) - (property (name "edg_short_path") (value "reg.fb.bottom_res")) - (property (name "edg_refdes") (value "R4")) - (property (name "edg_part") (value "0603WAF1002T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 10kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "175b043f")) -(comp (ref "C1") - (value "reg.hf_in_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.hf_in_cap.cap")) - (property (name "edg_short_path") (value "reg.hf_in_cap")) - (property (name "edg_refdes") (value "C1")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "11ed0398")) -(comp (ref "C2") - (value "reg.vbst_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.vbst_cap.cap")) - (property (name "edg_short_path") (value "reg.vbst_cap")) - (property (name "edg_refdes") (value "C2")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "0f330353")) -(comp (ref "L1") - (value "reg.power_path.inductor") - (footprint "Inductor_SMD:L_0603_1608Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.inductor")) - (property (name "edg_short_path") (value "reg.power_path.inductor")) - (property (name "edg_refdes") (value "L1")) - (property (name "edg_part") (value "MGFL1608F6R8MT-LF (microgate)")) - (property (name "edg_value") (value "400mA 6.8uH ±20% 530mΩ 0603 Inductors (SMD) ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0f2b0369")) -(comp (ref "C3") - (value "reg.power_path.in_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.in_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.in_cap")) - (property (name "edg_refdes") (value "C3")) - (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0879026b")) -(comp (ref "C4") - (value "reg.power_path.out_cap") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.out_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.out_cap")) - (property (name "edg_refdes") (value "C4")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0be902ec")) -(comp (ref "U2") - (value "mcu.ic") - (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.ic")) - (property (name "edg_short_path") (value "mcu.ic")) - (property (name "edg_refdes") (value "U2")) - (property (name "edg_part") (value "STM32F103xxT6 (STMicroelectronics)")) - (property (name "edg_value") (value "STM32F103xxT6")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "013700cd")) -(comp (ref "C5") - (value "mcu.pwr_cap[0]") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) - (property (name "edg_refdes") (value "C5")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168703d5")) -(comp (ref "C6") - (value "mcu.pwr_cap[1]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) - (property (name "edg_refdes") (value "C6")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168903d6")) -(comp (ref "C7") - (value "mcu.pwr_cap[2]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) - (property (name "edg_refdes") (value "C7")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168b03d7")) -(comp (ref "C8") - (value "mcu.pwr_cap[3]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) - (property (name "edg_refdes") (value "C8")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168d03d8")) -(comp (ref "C9") - (value "mcu.vdda_cap_0") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) - (property (name "edg_short_path") (value "mcu.vdda_cap_0")) - (property (name "edg_refdes") (value "C9")) - (property (name "edg_part") (value "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))")) - (property (name "edg_value") (value "50V 10nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "15dc03c2")) -(comp (ref "C10") - (value "mcu.vdda_cap_1") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) - (property (name "edg_short_path") (value "mcu.vdda_cap_1")) - (property (name "edg_refdes") (value "C10")) - (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "15dd03c3")) -(comp (ref "J2") - (value "mcu.swd") - (footprint "Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.swd.conn")) - (property (name "edg_short_path") (value "mcu.swd")) - (property (name "edg_refdes") (value "J2")) - (property (name "edg_part") (value "PinHeader1.27 Shrouded 2x5 (Generic)")) - (property (name "edg_value") (value "PinHeader1.27 Shrouded 2x5")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "02ae014f")) -(comp (ref "SW1") - (value "sw") - (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") - (property (name "Sheetname") (value "")) - (property (name "Sheetfile") (value "")) - (property (name "edg_path") (value "sw.package")) - (property (name "edg_short_path") (value "sw")) - (property (name "edg_refdes") (value "SW1")) - (property (name "edg_part") (value "5.1mm switch")) - (property (name "edg_value") (value "5.1mm switch")) - (sheetpath (names "/") (tstamps "/")) - (tstamps "015f00eb")) -(comp (ref "D1") - (value "led[0].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[0]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[0].package")) - (property (name "edg_short_path") (value "led[0].package")) - (property (name "edg_refdes") (value "D1")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[0]/") (tstamps "/07e5021e/")) - (tstamps "0b4e02cd")) -(comp (ref "R5") - (value "led[0].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[0]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[0].res")) - (property (name "edg_short_path") (value "led[0].res")) - (property (name "edg_refdes") (value "R5")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[0]/") (tstamps "/07e5021e/")) - (tstamps "0296014b")) -(comp (ref "D2") - (value "led[1].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[1]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[1].package")) - (property (name "edg_short_path") (value "led[1].package")) - (property (name "edg_refdes") (value "D2")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[1]/") (tstamps "/07e7021f/")) - (tstamps "0b4e02cd")) -(comp (ref "R6") - (value "led[1].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[1]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[1].res")) - (property (name "edg_short_path") (value "led[1].res")) - (property (name "edg_refdes") (value "R6")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[1]/") (tstamps "/07e7021f/")) - (tstamps "0296014b")) -(comp (ref "D3") - (value "led[2].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[2]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[2].package")) - (property (name "edg_short_path") (value "led[2].package")) - (property (name "edg_refdes") (value "D3")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[2]/") (tstamps "/07e90220/")) - (tstamps "0b4e02cd")) -(comp (ref "R7") - (value "led[2].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[2]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[2].res")) - (property (name "edg_short_path") (value "led[2].res")) - (property (name "edg_refdes") (value "R7")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[2]/") (tstamps "/07e90220/")) - (tstamps "0296014b")) -(comp (ref "D4") - (value "led[3].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[3]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[3].package")) - (property (name "edg_short_path") (value "led[3].package")) - (property (name "edg_refdes") (value "D4")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[3]/") (tstamps "/07eb0221/")) - (tstamps "0b4e02cd")) -(comp (ref "R8") - (value "led[3].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[3]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[3].res")) - (property (name "edg_short_path") (value "led[3].res")) - (property (name "edg_refdes") (value "R8")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[3]/") (tstamps "/07eb0221/")) - (tstamps "0296014b"))) -(nets -(net (code 1) (name "usb.pwr") - (node (ref J1) (pin A4)) - (node (ref J1) (pin A9)) - (node (ref J1) (pin B4)) - (node (ref J1) (pin B9)) - (node (ref U1) (pin 3)) - (node (ref U1) (pin 5)) - (node (ref C1) (pin 1)) - (node (ref C3) (pin 1))) -(net (code 2) (name "usb.gnd") - (node (ref J1) (pin A1)) - (node (ref J1) (pin A12)) - (node (ref J1) (pin B1)) - (node (ref J1) (pin B12)) - (node (ref J1) (pin S1)) - (node (ref R1) (pin 1)) - (node (ref R2) (pin 1)) - (node (ref U1) (pin 1)) - (node (ref R4) (pin 2)) - (node (ref C1) (pin 2)) - (node (ref C3) (pin 2)) - (node (ref C4) (pin 2)) - (node (ref U2) (pin 23)) - (node (ref U2) (pin 35)) - (node (ref U2) (pin 44)) - (node (ref U2) (pin 47)) - (node (ref U2) (pin 8)) - (node (ref C5) (pin 2)) - (node (ref C6) (pin 2)) - (node (ref C7) (pin 2)) - (node (ref C8) (pin 2)) - (node (ref C9) (pin 2)) - (node (ref C10) (pin 2)) - (node (ref J2) (pin 3)) - (node (ref J2) (pin 5)) - (node (ref J2) (pin 9)) - (node (ref SW1) (pin 2)) - (node (ref R5) (pin 2)) - (node (ref R6) (pin 2)) - (node (ref R7) (pin 2)) - (node (ref R8) (pin 2))) -(net (code 3) (name "usb.usb.dp") - (node (ref J1) (pin A6)) - (node (ref J1) (pin B6))) -(net (code 4) (name "usb.usb.dm") - (node (ref J1) (pin A7)) - (node (ref J1) (pin B7))) -(net (code 5) (name "usb.conn.cc.cc1") - (node (ref J1) (pin A5)) - (node (ref R1) (pin 2))) -(net (code 6) (name "usb.conn.cc.cc2") - (node (ref J1) (pin B5)) - (node (ref R2) (pin 2))) -(net (code 7) (name "reg.pwr_out") - (node (ref R3) (pin 1)) - (node (ref L1) (pin 2)) - (node (ref C4) (pin 1)) - (node (ref U2) (pin 1)) - (node (ref U2) (pin 24)) - (node (ref U2) (pin 36)) - (node (ref U2) (pin 48)) - (node (ref U2) (pin 9)) - (node (ref C5) (pin 1)) - (node (ref C6) (pin 1)) - (node (ref C7) (pin 1)) - (node (ref C8) (pin 1)) - (node (ref C9) (pin 1)) - (node (ref C10) (pin 1)) - (node (ref J2) (pin 1))) -(net (code 8) (name "reg.ic.sw") - (node (ref U1) (pin 2)) - (node (ref C2) (pin 2)) - (node (ref L1) (pin 1))) -(net (code 9) (name "reg.ic.fb") - (node (ref U1) (pin 4)) - (node (ref R3) (pin 2)) - (node (ref R4) (pin 1))) -(net (code 10) (name "reg.ic.vbst") - (node (ref U1) (pin 6)) - (node (ref C2) (pin 1))) -(net (code 11) (name "mcu.swd_node.swdio") - (node (ref U2) (pin 34)) - (node (ref J2) (pin 2))) -(net (code 12) (name "mcu.swd_node.swclk") - (node (ref U2) (pin 37)) - (node (ref J2) (pin 4))) -(net (code 13) (name "mcu.reset_node") - (node (ref U2) (pin 7)) - (node (ref J2) (pin 10))) -(net (code 14) (name "mcu.ic.osc.xtal_in") - (node (ref U2) (pin 5))) -(net (code 15) (name "mcu.ic.osc.xtal_out") - (node (ref U2) (pin 6))) -(net (code 16) (name "mcu.swd.tdi") - (node (ref J2) (pin 8))) -(net (code 17) (name "mcu.swd.swo") - (node (ref J2) (pin 6))) -(net (code 18) (name "sw.out") - (node (ref U2) (pin 10)) - (node (ref SW1) (pin 1))) -(net (code 19) (name "led[0].signal") - (node (ref U2) (pin 11)) - (node (ref D1) (pin 2))) -(net (code 20) (name "led[0].package.k") - (node (ref D1) (pin 1)) - (node (ref R5) (pin 1))) -(net (code 21) (name "led[1].signal") - (node (ref U2) (pin 12)) - (node (ref D2) (pin 2))) -(net (code 22) (name "led[1].package.k") - (node (ref D2) (pin 1)) - (node (ref R6) (pin 1))) -(net (code 23) (name "led[2].signal") - (node (ref U2) (pin 13)) - (node (ref D3) (pin 2))) -(net (code 24) (name "led[2].package.k") - (node (ref D3) (pin 1)) - (node (ref R7) (pin 1))) -(net (code 25) (name "led[3].signal") - (node (ref U2) (pin 14)) - (node (ref D4) (pin 2))) -(net (code 26) (name "led[3].package.k") - (node (ref D4) (pin 1)) - (node (ref R8) (pin 1)))) -) \ No newline at end of file diff --git a/examples/TestBlinkyChain/TestBlinkyChain.svgpcb.js b/examples/TestBlinkyChain/TestBlinkyChain.svgpcb.js deleted file mode 100644 index 0131c90ca..000000000 --- a/examples/TestBlinkyChain/TestBlinkyChain.svgpcb.js +++ /dev/null @@ -1,211 +0,0 @@ -const board = new PCB(); - -// usb.conn -const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { - translate: pt(1.111, 0.165), rotate: 0, - id: 'J1' -}) -// usb.cc_pull.cc1 -const R1 = board.add(R_0603_1608Metric, { - translate: pt(0.960, 0.420), rotate: 0, - id: 'R1' -}) -// usb.cc_pull.cc2 -const R2 = board.add(R_0603_1608Metric, { - translate: pt(1.116, 0.420), rotate: 0, - id: 'R2' -}) -// reg.ic -const U1 = board.add(SOT_23_6, { - translate: pt(0.081, 0.804), rotate: 0, - id: 'U1' -}) -// reg.fb.div.top_res -const R3 = board.add(R_0603_1608Metric, { - translate: pt(0.058, 0.939), rotate: 0, - id: 'R3' -}) -// reg.fb.div.bottom_res -const R4 = board.add(R_0603_1608Metric, { - translate: pt(0.214, 0.939), rotate: 0, - id: 'R4' -}) -// reg.hf_in_cap.cap -const C1 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 0.939), rotate: 0, - id: 'C1' -}) -// reg.vbst_cap.cap -const C2 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 1.036), rotate: 0, - id: 'C2' -}) -// reg.power_path.inductor -const L1 = board.add(L_0603_1608Metric, { - translate: pt(0.214, 1.036), rotate: 0, - id: 'L1' -}) -// reg.power_path.in_cap.cap -const C3 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 1.036), rotate: 0, - id: 'C3' -}) -// reg.power_path.out_cap.cap -const C4 = board.add(C_0805_2012Metric, { - translate: pt(0.268, 0.776), rotate: 0, - id: 'C4' -}) -// mcu.ic -const U2 = board.add(LQFP_48_7x7mm_P0_5mm, { - translate: pt(0.203, 0.203), rotate: 0, - id: 'U2' -}) -// mcu.pwr_cap[0].cap -const C5 = board.add(C_0805_2012Metric, { - translate: pt(0.067, 0.483), rotate: 0, - id: 'C5' -}) -// mcu.pwr_cap[1].cap -const C6 = board.add(C_0603_1608Metric, { - translate: pt(0.231, 0.474), rotate: 0, - id: 'C6' -}) -// mcu.pwr_cap[2].cap -const C7 = board.add(C_0603_1608Metric, { - translate: pt(0.387, 0.474), rotate: 0, - id: 'C7' -}) -// mcu.pwr_cap[3].cap -const C8 = board.add(C_0603_1608Metric, { - translate: pt(0.543, 0.474), rotate: 0, - id: 'C8' -}) -// mcu.vdda_cap_0.cap -const C9 = board.add(C_0603_1608Metric, { - translate: pt(0.699, 0.474), rotate: 0, - id: 'C9' -}) -// mcu.vdda_cap_1.cap -const C10 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 0.590), rotate: 0, - id: 'C10' -}) -// mcu.swd.conn -const J2 = board.add(PinHeader_2x05_P1_27mm_Vertical_SMD, { - translate: pt(0.614, 0.146), rotate: 0, - id: 'J2' -}) -// sw.package -const SW1 = board.add(SW_SPST_SKQG_WithoutStem, { - translate: pt(0.714, 0.849), rotate: 0, - id: 'SW1' -}) -// led[0].package -const D1 = board.add(LED_0603_1608Metric, { - translate: pt(1.058, 0.766), rotate: 0, - id: 'D1' -}) -// led[0].res -const R5 = board.add(R_0603_1608Metric, { - translate: pt(1.057, 0.863), rotate: 0, - id: 'R5' -}) -// led[1].package -const D2 = board.add(LED_0603_1608Metric, { - translate: pt(1.293, 0.766), rotate: 0, - id: 'D2' -}) -// led[1].res -const R6 = board.add(R_0603_1608Metric, { - translate: pt(1.292, 0.863), rotate: 0, - id: 'R6' -}) -// led[2].package -const D3 = board.add(LED_0603_1608Metric, { - translate: pt(0.058, 1.212), rotate: 0, - id: 'D3' -}) -// led[2].res -const R7 = board.add(R_0603_1608Metric, { - translate: pt(0.058, 1.309), rotate: 0, - id: 'R7' -}) -// led[3].package -const D4 = board.add(LED_0603_1608Metric, { - translate: pt(0.293, 1.212), rotate: 0, - id: 'D4' -}) -// led[3].res -const R8 = board.add(R_0603_1608Metric, { - translate: pt(0.293, 1.309), rotate: 0, - id: 'R8' -}) - -board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["U1", "5"], ["C1", "1"], ["C3", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["R4", "2"], ["C1", "2"], ["C3", "2"], ["C4", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["SW1", "2"], ["R5", "2"], ["R6", "2"], ["R7", "2"], ["R8", "2"]]}, - {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"]]}, - {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"]]}, - {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, - {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, - {name: "reg.pwr_out", pads: [["R3", "1"], ["L1", "2"], ["C4", "1"], ["U2", "1"], ["U2", "24"], ["U2", "36"], ["U2", "48"], ["U2", "9"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["C8", "1"], ["C9", "1"], ["C10", "1"], ["J2", "1"]]}, - {name: "reg.ic.sw", pads: [["U1", "2"], ["C2", "2"], ["L1", "1"]]}, - {name: "reg.ic.fb", pads: [["U1", "4"], ["R3", "2"], ["R4", "1"]]}, - {name: "reg.ic.vbst", pads: [["U1", "6"], ["C2", "1"]]}, - {name: "mcu.swd_node.swdio", pads: [["U2", "34"], ["J2", "2"]]}, - {name: "mcu.swd_node.swclk", pads: [["U2", "37"], ["J2", "4"]]}, - {name: "mcu.reset_node", pads: [["U2", "7"], ["J2", "10"]]}, - {name: "mcu.ic.osc.xtal_in", pads: [["U2", "5"]]}, - {name: "mcu.ic.osc.xtal_out", pads: [["U2", "6"]]}, - {name: "mcu.swd.tdi", pads: [["J2", "8"]]}, - {name: "mcu.swd.swo", pads: [["J2", "6"]]}, - {name: "sw.out", pads: [["U2", "10"], ["SW1", "1"]]}, - {name: "led[0].signal", pads: [["U2", "11"], ["D1", "2"]]}, - {name: "led[0].package.k", pads: [["D1", "1"], ["R5", "1"]]}, - {name: "led[1].signal", pads: [["U2", "12"], ["D2", "2"]]}, - {name: "led[1].package.k", pads: [["D2", "1"], ["R6", "1"]]}, - {name: "led[2].signal", pads: [["U2", "13"], ["D3", "2"]]}, - {name: "led[2].package.k", pads: [["D3", "1"], ["R7", "1"]]}, - {name: "led[3].signal", pads: [["U2", "14"], ["D4", "2"]]}, - {name: "led[3].package.k", pads: [["D4", "1"], ["R8", "1"]]} -]) - -const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(1.4688976377952758, 1.455511811023622); -const xMin = Math.min(limit0[0], limit1[0]); -const xMax = Math.max(limit0[0], limit1[0]); -const yMin = Math.min(limit0[1], limit1[1]); -const yMax = Math.max(limit0[1], limit1[1]); - -const filletRadius = 0.1; -const outline = path( - [(xMin+xMax/2), yMax], - ["fillet", filletRadius, [xMax, yMax]], - ["fillet", filletRadius, [xMax, yMin]], - ["fillet", filletRadius, [xMin, yMin]], - ["fillet", filletRadius, [xMin, yMax]], - [(xMin+xMax/2), yMax], -); -board.addShape("outline", outline); - -renderPCB({ - pcb: board, - layerColors: { - "F.Paste": "#000000ff", - "F.Mask": "#000000ff", - "B.Mask": "#000000ff", - "componentLabels": "#00e5e5e5", - "outline": "#002d00ff", - "padLabels": "#ffff99e5", - "B.Cu": "#ef4e4eff", - "F.Cu": "#ff8c00cc", - }, - limits: { - x: [xMin, xMax], - y: [yMin, yMax] - }, - background: "#00000000", - mmPerUnit: 25.4 -}) - - diff --git a/examples/TestBlinkyComplete/TestBlinkyComplete.net.ref b/examples/TestBlinkyComplete/TestBlinkyComplete.net.ref deleted file mode 100644 index 84f754732..000000000 --- a/examples/TestBlinkyComplete/TestBlinkyComplete.net.ref +++ /dev/null @@ -1,355 +0,0 @@ -(export (version D) -(components -(comp (ref "J1") - (value "usb.conn") - (footprint "Connector_USB:USB_C_Receptacle_XKB_U262-16XN-4BVC11") - (property (name "Sheetname") (value "usb")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCReceptacle")) - (property (name "edg_path") (value "usb.conn")) - (property (name "edg_short_path") (value "usb.conn")) - (property (name "edg_refdes") (value "J1")) - (property (name "edg_part") (value "COM-15111 (Sparkfun)")) - (property (name "edg_value") (value "COM-15111")) - (sheetpath (names "/usb/") (tstamps "/02aa014b/")) - (tstamps "042701af")) -(comp (ref "R1") - (value "usb.cc_pull.cc1") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "cc_pull")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) - (property (name "edg_path") (value "usb.cc_pull.cc1")) - (property (name "edg_short_path") (value "usb.cc_pull.cc1")) - (property (name "edg_refdes") (value "R1")) - (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) - (tstamps "022300f8")) -(comp (ref "R2") - (value "usb.cc_pull.cc2") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "cc_pull")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) - (property (name "edg_path") (value "usb.cc_pull.cc2")) - (property (name "edg_short_path") (value "usb.cc_pull.cc2")) - (property (name "edg_refdes") (value "R2")) - (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) - (tstamps "022400f9")) -(comp (ref "U1") - (value "reg.ic") - (footprint "Package_TO_SOT_SMD:SOT-23-6") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.ic")) - (property (name "edg_short_path") (value "reg.ic")) - (property (name "edg_refdes") (value "U1")) - (property (name "edg_part") (value "TPS561201 (Texas Instruments)")) - (property (name "edg_value") (value "TPS561201")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "013700cd")) -(comp (ref "R3") - (value "reg.fb.top_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.top_res")) - (property (name "edg_short_path") (value "reg.fb.top_res")) - (property (name "edg_refdes") (value "R3")) - (property (name "edg_part") (value "0603WAF3302T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 33kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "0c0c02fd")) -(comp (ref "R4") - (value "reg.fb.bottom_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.bottom_res")) - (property (name "edg_short_path") (value "reg.fb.bottom_res")) - (property (name "edg_refdes") (value "R4")) - (property (name "edg_part") (value "0603WAF1002T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 10kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "175b043f")) -(comp (ref "C1") - (value "reg.hf_in_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.hf_in_cap.cap")) - (property (name "edg_short_path") (value "reg.hf_in_cap")) - (property (name "edg_refdes") (value "C1")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "11ed0398")) -(comp (ref "C2") - (value "reg.vbst_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.vbst_cap.cap")) - (property (name "edg_short_path") (value "reg.vbst_cap")) - (property (name "edg_refdes") (value "C2")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "0f330353")) -(comp (ref "L1") - (value "reg.power_path.inductor") - (footprint "Inductor_SMD:L_0603_1608Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.inductor")) - (property (name "edg_short_path") (value "reg.power_path.inductor")) - (property (name "edg_refdes") (value "L1")) - (property (name "edg_part") (value "MGFL1608F6R8MT-LF (microgate)")) - (property (name "edg_value") (value "400mA 6.8uH ±20% 530mΩ 0603 Inductors (SMD) ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0f2b0369")) -(comp (ref "C3") - (value "reg.power_path.in_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.in_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.in_cap")) - (property (name "edg_refdes") (value "C3")) - (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0879026b")) -(comp (ref "C4") - (value "reg.power_path.out_cap") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.out_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.out_cap")) - (property (name "edg_refdes") (value "C4")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0be902ec")) -(comp (ref "U2") - (value "mcu.ic") - (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.ic")) - (property (name "edg_short_path") (value "mcu.ic")) - (property (name "edg_refdes") (value "U2")) - (property (name "edg_part") (value "STM32F103xxT6 (STMicroelectronics)")) - (property (name "edg_value") (value "STM32F103xxT6")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "013700cd")) -(comp (ref "C5") - (value "mcu.pwr_cap[0]") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) - (property (name "edg_refdes") (value "C5")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168703d5")) -(comp (ref "C6") - (value "mcu.pwr_cap[1]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) - (property (name "edg_refdes") (value "C6")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168903d6")) -(comp (ref "C7") - (value "mcu.pwr_cap[2]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) - (property (name "edg_refdes") (value "C7")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168b03d7")) -(comp (ref "C8") - (value "mcu.pwr_cap[3]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) - (property (name "edg_refdes") (value "C8")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168d03d8")) -(comp (ref "C9") - (value "mcu.vdda_cap_0") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) - (property (name "edg_short_path") (value "mcu.vdda_cap_0")) - (property (name "edg_refdes") (value "C9")) - (property (name "edg_part") (value "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))")) - (property (name "edg_value") (value "50V 10nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "15dc03c2")) -(comp (ref "C10") - (value "mcu.vdda_cap_1") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) - (property (name "edg_short_path") (value "mcu.vdda_cap_1")) - (property (name "edg_refdes") (value "C10")) - (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "15dd03c3")) -(comp (ref "J2") - (value "mcu.swd") - (footprint "Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.swd.conn")) - (property (name "edg_short_path") (value "mcu.swd")) - (property (name "edg_refdes") (value "J2")) - (property (name "edg_part") (value "PinHeader1.27 Shrouded 2x5 (Generic)")) - (property (name "edg_value") (value "PinHeader1.27 Shrouded 2x5")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "02ae014f")) -(comp (ref "D1") - (value "led.package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led.package")) - (property (name "edg_short_path") (value "led.package")) - (property (name "edg_refdes") (value "D1")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led/") (tstamps "/02750136/")) - (tstamps "0b4e02cd")) -(comp (ref "R5") - (value "led.res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led.res")) - (property (name "edg_short_path") (value "led.res")) - (property (name "edg_refdes") (value "R5")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led/") (tstamps "/02750136/")) - (tstamps "0296014b"))) -(nets -(net (code 1) (name "usb.pwr") - (node (ref J1) (pin A4)) - (node (ref J1) (pin A9)) - (node (ref J1) (pin B4)) - (node (ref J1) (pin B9)) - (node (ref U1) (pin 3)) - (node (ref U1) (pin 5)) - (node (ref C1) (pin 1)) - (node (ref C3) (pin 1))) -(net (code 2) (name "usb.gnd") - (node (ref J1) (pin A1)) - (node (ref J1) (pin A12)) - (node (ref J1) (pin B1)) - (node (ref J1) (pin B12)) - (node (ref J1) (pin S1)) - (node (ref R1) (pin 1)) - (node (ref R2) (pin 1)) - (node (ref U1) (pin 1)) - (node (ref R4) (pin 2)) - (node (ref C1) (pin 2)) - (node (ref C3) (pin 2)) - (node (ref C4) (pin 2)) - (node (ref U2) (pin 23)) - (node (ref U2) (pin 35)) - (node (ref U2) (pin 44)) - (node (ref U2) (pin 47)) - (node (ref U2) (pin 8)) - (node (ref C5) (pin 2)) - (node (ref C6) (pin 2)) - (node (ref C7) (pin 2)) - (node (ref C8) (pin 2)) - (node (ref C9) (pin 2)) - (node (ref C10) (pin 2)) - (node (ref J2) (pin 3)) - (node (ref J2) (pin 5)) - (node (ref J2) (pin 9)) - (node (ref R5) (pin 2))) -(net (code 3) (name "usb.usb.dp") - (node (ref J1) (pin A6)) - (node (ref J1) (pin B6))) -(net (code 4) (name "usb.usb.dm") - (node (ref J1) (pin A7)) - (node (ref J1) (pin B7))) -(net (code 5) (name "usb.conn.cc.cc1") - (node (ref J1) (pin A5)) - (node (ref R1) (pin 2))) -(net (code 6) (name "usb.conn.cc.cc2") - (node (ref J1) (pin B5)) - (node (ref R2) (pin 2))) -(net (code 7) (name "reg.pwr_out") - (node (ref R3) (pin 1)) - (node (ref L1) (pin 2)) - (node (ref C4) (pin 1)) - (node (ref U2) (pin 1)) - (node (ref U2) (pin 24)) - (node (ref U2) (pin 36)) - (node (ref U2) (pin 48)) - (node (ref U2) (pin 9)) - (node (ref C5) (pin 1)) - (node (ref C6) (pin 1)) - (node (ref C7) (pin 1)) - (node (ref C8) (pin 1)) - (node (ref C9) (pin 1)) - (node (ref C10) (pin 1)) - (node (ref J2) (pin 1))) -(net (code 8) (name "reg.ic.sw") - (node (ref U1) (pin 2)) - (node (ref C2) (pin 2)) - (node (ref L1) (pin 1))) -(net (code 9) (name "reg.ic.fb") - (node (ref U1) (pin 4)) - (node (ref R3) (pin 2)) - (node (ref R4) (pin 1))) -(net (code 10) (name "reg.ic.vbst") - (node (ref U1) (pin 6)) - (node (ref C2) (pin 1))) -(net (code 11) (name "mcu.swd_node.swdio") - (node (ref U2) (pin 34)) - (node (ref J2) (pin 2))) -(net (code 12) (name "mcu.swd_node.swclk") - (node (ref U2) (pin 37)) - (node (ref J2) (pin 4))) -(net (code 13) (name "mcu.reset_node") - (node (ref U2) (pin 7)) - (node (ref J2) (pin 10))) -(net (code 14) (name "mcu.ic.osc.xtal_in") - (node (ref U2) (pin 5))) -(net (code 15) (name "mcu.ic.osc.xtal_out") - (node (ref U2) (pin 6))) -(net (code 16) (name "mcu.swd.tdi") - (node (ref J2) (pin 8))) -(net (code 17) (name "mcu.swd.swo") - (node (ref J2) (pin 6))) -(net (code 18) (name "led.signal") - (node (ref U2) (pin 10)) - (node (ref D1) (pin 2))) -(net (code 19) (name "led.package.k") - (node (ref D1) (pin 1)) - (node (ref R5) (pin 1)))) -) \ No newline at end of file diff --git a/examples/TestBlinkyComplete/TestBlinkyComplete.svgpcb.js b/examples/TestBlinkyComplete/TestBlinkyComplete.svgpcb.js deleted file mode 100644 index 711c2ee7d..000000000 --- a/examples/TestBlinkyComplete/TestBlinkyComplete.svgpcb.js +++ /dev/null @@ -1,169 +0,0 @@ -const board = new PCB(); - -// usb.conn -const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { - translate: pt(1.111, 0.165), rotate: 0, - id: 'J1' -}) -// usb.cc_pull.cc1 -const R1 = board.add(R_0603_1608Metric, { - translate: pt(0.960, 0.420), rotate: 0, - id: 'R1' -}) -// usb.cc_pull.cc2 -const R2 = board.add(R_0603_1608Metric, { - translate: pt(1.116, 0.420), rotate: 0, - id: 'R2' -}) -// reg.ic -const U1 = board.add(SOT_23_6, { - translate: pt(0.081, 0.804), rotate: 0, - id: 'U1' -}) -// reg.fb.div.top_res -const R3 = board.add(R_0603_1608Metric, { - translate: pt(0.058, 0.939), rotate: 0, - id: 'R3' -}) -// reg.fb.div.bottom_res -const R4 = board.add(R_0603_1608Metric, { - translate: pt(0.214, 0.939), rotate: 0, - id: 'R4' -}) -// reg.hf_in_cap.cap -const C1 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 0.939), rotate: 0, - id: 'C1' -}) -// reg.vbst_cap.cap -const C2 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 1.036), rotate: 0, - id: 'C2' -}) -// reg.power_path.inductor -const L1 = board.add(L_0603_1608Metric, { - translate: pt(0.214, 1.036), rotate: 0, - id: 'L1' -}) -// reg.power_path.in_cap.cap -const C3 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 1.036), rotate: 0, - id: 'C3' -}) -// reg.power_path.out_cap.cap -const C4 = board.add(C_0805_2012Metric, { - translate: pt(0.268, 0.776), rotate: 0, - id: 'C4' -}) -// mcu.ic -const U2 = board.add(LQFP_48_7x7mm_P0_5mm, { - translate: pt(0.203, 0.203), rotate: 0, - id: 'U2' -}) -// mcu.pwr_cap[0].cap -const C5 = board.add(C_0805_2012Metric, { - translate: pt(0.067, 0.483), rotate: 0, - id: 'C5' -}) -// mcu.pwr_cap[1].cap -const C6 = board.add(C_0603_1608Metric, { - translate: pt(0.231, 0.474), rotate: 0, - id: 'C6' -}) -// mcu.pwr_cap[2].cap -const C7 = board.add(C_0603_1608Metric, { - translate: pt(0.387, 0.474), rotate: 0, - id: 'C7' -}) -// mcu.pwr_cap[3].cap -const C8 = board.add(C_0603_1608Metric, { - translate: pt(0.543, 0.474), rotate: 0, - id: 'C8' -}) -// mcu.vdda_cap_0.cap -const C9 = board.add(C_0603_1608Metric, { - translate: pt(0.699, 0.474), rotate: 0, - id: 'C9' -}) -// mcu.vdda_cap_1.cap -const C10 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 0.590), rotate: 0, - id: 'C10' -}) -// mcu.swd.conn -const J2 = board.add(PinHeader_2x05_P1_27mm_Vertical_SMD, { - translate: pt(0.614, 0.146), rotate: 0, - id: 'J2' -}) -// led.package -const D1 = board.add(LED_0603_1608Metric, { - translate: pt(0.605, 0.766), rotate: 0, - id: 'D1' -}) -// led.res -const R5 = board.add(R_0603_1608Metric, { - translate: pt(0.605, 0.863), rotate: 0, - id: 'R5' -}) - -board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["U1", "5"], ["C1", "1"], ["C3", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["R4", "2"], ["C1", "2"], ["C3", "2"], ["C4", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R5", "2"]]}, - {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"]]}, - {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"]]}, - {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, - {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, - {name: "reg.pwr_out", pads: [["R3", "1"], ["L1", "2"], ["C4", "1"], ["U2", "1"], ["U2", "24"], ["U2", "36"], ["U2", "48"], ["U2", "9"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["C8", "1"], ["C9", "1"], ["C10", "1"], ["J2", "1"]]}, - {name: "reg.ic.sw", pads: [["U1", "2"], ["C2", "2"], ["L1", "1"]]}, - {name: "reg.ic.fb", pads: [["U1", "4"], ["R3", "2"], ["R4", "1"]]}, - {name: "reg.ic.vbst", pads: [["U1", "6"], ["C2", "1"]]}, - {name: "mcu.swd_node.swdio", pads: [["U2", "34"], ["J2", "2"]]}, - {name: "mcu.swd_node.swclk", pads: [["U2", "37"], ["J2", "4"]]}, - {name: "mcu.reset_node", pads: [["U2", "7"], ["J2", "10"]]}, - {name: "mcu.ic.osc.xtal_in", pads: [["U2", "5"]]}, - {name: "mcu.ic.osc.xtal_out", pads: [["U2", "6"]]}, - {name: "mcu.swd.tdi", pads: [["J2", "8"]]}, - {name: "mcu.swd.swo", pads: [["J2", "6"]]}, - {name: "led.signal", pads: [["U2", "10"], ["D1", "2"]]}, - {name: "led.package.k", pads: [["D1", "1"], ["R5", "1"]]} -]) - -const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(1.4385826771653545, 1.1826771653543309); -const xMin = Math.min(limit0[0], limit1[0]); -const xMax = Math.max(limit0[0], limit1[0]); -const yMin = Math.min(limit0[1], limit1[1]); -const yMax = Math.max(limit0[1], limit1[1]); - -const filletRadius = 0.1; -const outline = path( - [(xMin+xMax/2), yMax], - ["fillet", filletRadius, [xMax, yMax]], - ["fillet", filletRadius, [xMax, yMin]], - ["fillet", filletRadius, [xMin, yMin]], - ["fillet", filletRadius, [xMin, yMax]], - [(xMin+xMax/2), yMax], -); -board.addShape("outline", outline); - -renderPCB({ - pcb: board, - layerColors: { - "F.Paste": "#000000ff", - "F.Mask": "#000000ff", - "B.Mask": "#000000ff", - "componentLabels": "#00e5e5e5", - "outline": "#002d00ff", - "padLabels": "#ffff99e5", - "B.Cu": "#ef4e4eff", - "F.Cu": "#ff8c00cc", - }, - limits: { - x: [xMin, xMax], - y: [yMin, yMax] - }, - background: "#00000000", - mmPerUnit: 25.4 -}) - - diff --git a/examples/TestBlinkyExpanded/TestBlinkyExpanded.net.ref b/examples/TestBlinkyExpanded/TestBlinkyExpanded.net.ref deleted file mode 100644 index 21abf4314..000000000 --- a/examples/TestBlinkyExpanded/TestBlinkyExpanded.net.ref +++ /dev/null @@ -1,464 +0,0 @@ -(export (version D) -(components -(comp (ref "J1") - (value "usb.conn") - (footprint "Connector_USB:USB_C_Receptacle_XKB_U262-16XN-4BVC11") - (property (name "Sheetname") (value "usb")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCReceptacle")) - (property (name "edg_path") (value "usb.conn")) - (property (name "edg_short_path") (value "usb.conn")) - (property (name "edg_refdes") (value "J1")) - (property (name "edg_part") (value "COM-15111 (Sparkfun)")) - (property (name "edg_value") (value "COM-15111")) - (sheetpath (names "/usb/") (tstamps "/02aa014b/")) - (tstamps "042701af")) -(comp (ref "R1") - (value "usb.cc_pull.cc1") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "cc_pull")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) - (property (name "edg_path") (value "usb.cc_pull.cc1")) - (property (name "edg_short_path") (value "usb.cc_pull.cc1")) - (property (name "edg_refdes") (value "R1")) - (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) - (tstamps "022300f8")) -(comp (ref "R2") - (value "usb.cc_pull.cc2") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "cc_pull")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) - (property (name "edg_path") (value "usb.cc_pull.cc2")) - (property (name "edg_short_path") (value "usb.cc_pull.cc2")) - (property (name "edg_refdes") (value "R2")) - (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) - (tstamps "022400f9")) -(comp (ref "U1") - (value "reg.ic") - (footprint "Package_TO_SOT_SMD:SOT-23-6") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.ic")) - (property (name "edg_short_path") (value "reg.ic")) - (property (name "edg_refdes") (value "U1")) - (property (name "edg_part") (value "TPS561201 (Texas Instruments)")) - (property (name "edg_value") (value "TPS561201")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "013700cd")) -(comp (ref "R3") - (value "reg.fb.top_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.top_res")) - (property (name "edg_short_path") (value "reg.fb.top_res")) - (property (name "edg_refdes") (value "R3")) - (property (name "edg_part") (value "0603WAF3302T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 33kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "0c0c02fd")) -(comp (ref "R4") - (value "reg.fb.bottom_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.bottom_res")) - (property (name "edg_short_path") (value "reg.fb.bottom_res")) - (property (name "edg_refdes") (value "R4")) - (property (name "edg_part") (value "0603WAF1002T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 10kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "175b043f")) -(comp (ref "C1") - (value "reg.hf_in_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.hf_in_cap.cap")) - (property (name "edg_short_path") (value "reg.hf_in_cap")) - (property (name "edg_refdes") (value "C1")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "11ed0398")) -(comp (ref "C2") - (value "reg.vbst_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.vbst_cap.cap")) - (property (name "edg_short_path") (value "reg.vbst_cap")) - (property (name "edg_refdes") (value "C2")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "0f330353")) -(comp (ref "L1") - (value "reg.power_path.inductor") - (footprint "Inductor_SMD:L_0603_1608Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.inductor")) - (property (name "edg_short_path") (value "reg.power_path.inductor")) - (property (name "edg_refdes") (value "L1")) - (property (name "edg_part") (value "MGFL1608F6R8MT-LF (microgate)")) - (property (name "edg_value") (value "400mA 6.8uH ±20% 530mΩ 0603 Inductors (SMD) ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0f2b0369")) -(comp (ref "C3") - (value "reg.power_path.in_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.in_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.in_cap")) - (property (name "edg_refdes") (value "C3")) - (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0879026b")) -(comp (ref "C4") - (value "reg.power_path.out_cap") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.out_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.out_cap")) - (property (name "edg_refdes") (value "C4")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0be902ec")) -(comp (ref "U2") - (value "mcu.ic") - (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.ic")) - (property (name "edg_short_path") (value "mcu.ic")) - (property (name "edg_refdes") (value "U2")) - (property (name "edg_part") (value "STM32F103xxT6 (STMicroelectronics)")) - (property (name "edg_value") (value "STM32F103xxT6")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "013700cd")) -(comp (ref "C5") - (value "mcu.pwr_cap[0]") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) - (property (name "edg_refdes") (value "C5")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168703d5")) -(comp (ref "C6") - (value "mcu.pwr_cap[1]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) - (property (name "edg_refdes") (value "C6")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168903d6")) -(comp (ref "C7") - (value "mcu.pwr_cap[2]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) - (property (name "edg_refdes") (value "C7")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168b03d7")) -(comp (ref "C8") - (value "mcu.pwr_cap[3]") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) - (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) - (property (name "edg_refdes") (value "C8")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "168d03d8")) -(comp (ref "C9") - (value "mcu.vdda_cap_0") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) - (property (name "edg_short_path") (value "mcu.vdda_cap_0")) - (property (name "edg_refdes") (value "C9")) - (property (name "edg_part") (value "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))")) - (property (name "edg_value") (value "50V 10nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "15dc03c2")) -(comp (ref "C10") - (value "mcu.vdda_cap_1") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) - (property (name "edg_short_path") (value "mcu.vdda_cap_1")) - (property (name "edg_refdes") (value "C10")) - (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "15dd03c3")) -(comp (ref "J2") - (value "mcu.swd") - (footprint "Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) - (property (name "edg_path") (value "mcu.swd.conn")) - (property (name "edg_short_path") (value "mcu.swd")) - (property (name "edg_refdes") (value "J2")) - (property (name "edg_part") (value "PinHeader1.27 Shrouded 2x5 (Generic)")) - (property (name "edg_value") (value "PinHeader1.27 Shrouded 2x5")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "02ae014f")) -(comp (ref "SW1") - (value "sw") - (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") - (property (name "Sheetname") (value "")) - (property (name "Sheetfile") (value "")) - (property (name "edg_path") (value "sw.package")) - (property (name "edg_short_path") (value "sw")) - (property (name "edg_refdes") (value "SW1")) - (property (name "edg_part") (value "5.1mm switch")) - (property (name "edg_value") (value "5.1mm switch")) - (sheetpath (names "/") (tstamps "/")) - (tstamps "015f00eb")) -(comp (ref "D1") - (value "led[0].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[0]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[0].package")) - (property (name "edg_short_path") (value "led[0].package")) - (property (name "edg_refdes") (value "D1")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[0]/") (tstamps "/07e5021e/")) - (tstamps "0b4e02cd")) -(comp (ref "R5") - (value "led[0].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[0]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[0].res")) - (property (name "edg_short_path") (value "led[0].res")) - (property (name "edg_refdes") (value "R5")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[0]/") (tstamps "/07e5021e/")) - (tstamps "0296014b")) -(comp (ref "D2") - (value "led[1].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[1]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[1].package")) - (property (name "edg_short_path") (value "led[1].package")) - (property (name "edg_refdes") (value "D2")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[1]/") (tstamps "/07e7021f/")) - (tstamps "0b4e02cd")) -(comp (ref "R6") - (value "led[1].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[1]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[1].res")) - (property (name "edg_short_path") (value "led[1].res")) - (property (name "edg_refdes") (value "R6")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[1]/") (tstamps "/07e7021f/")) - (tstamps "0296014b")) -(comp (ref "D3") - (value "led[2].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[2]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[2].package")) - (property (name "edg_short_path") (value "led[2].package")) - (property (name "edg_refdes") (value "D3")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[2]/") (tstamps "/07e90220/")) - (tstamps "0b4e02cd")) -(comp (ref "R7") - (value "led[2].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[2]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[2].res")) - (property (name "edg_short_path") (value "led[2].res")) - (property (name "edg_refdes") (value "R7")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[2]/") (tstamps "/07e90220/")) - (tstamps "0296014b")) -(comp (ref "D4") - (value "led[3].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[3]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[3].package")) - (property (name "edg_short_path") (value "led[3].package")) - (property (name "edg_refdes") (value "D4")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[3]/") (tstamps "/07eb0221/")) - (tstamps "0b4e02cd")) -(comp (ref "R8") - (value "led[3].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[3]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[3].res")) - (property (name "edg_short_path") (value "led[3].res")) - (property (name "edg_refdes") (value "R8")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[3]/") (tstamps "/07eb0221/")) - (tstamps "0296014b"))) -(nets -(net (code 1) (name "usb.pwr") - (node (ref J1) (pin A4)) - (node (ref J1) (pin A9)) - (node (ref J1) (pin B4)) - (node (ref J1) (pin B9)) - (node (ref U1) (pin 3)) - (node (ref U1) (pin 5)) - (node (ref C1) (pin 1)) - (node (ref C3) (pin 1))) -(net (code 2) (name "usb.gnd") - (node (ref J1) (pin A1)) - (node (ref J1) (pin A12)) - (node (ref J1) (pin B1)) - (node (ref J1) (pin B12)) - (node (ref J1) (pin S1)) - (node (ref R1) (pin 1)) - (node (ref R2) (pin 1)) - (node (ref U1) (pin 1)) - (node (ref R4) (pin 2)) - (node (ref C1) (pin 2)) - (node (ref C3) (pin 2)) - (node (ref C4) (pin 2)) - (node (ref U2) (pin 23)) - (node (ref U2) (pin 35)) - (node (ref U2) (pin 44)) - (node (ref U2) (pin 47)) - (node (ref U2) (pin 8)) - (node (ref C5) (pin 2)) - (node (ref C6) (pin 2)) - (node (ref C7) (pin 2)) - (node (ref C8) (pin 2)) - (node (ref C9) (pin 2)) - (node (ref C10) (pin 2)) - (node (ref J2) (pin 3)) - (node (ref J2) (pin 5)) - (node (ref J2) (pin 9)) - (node (ref SW1) (pin 2)) - (node (ref R5) (pin 2)) - (node (ref R6) (pin 2)) - (node (ref R7) (pin 2)) - (node (ref R8) (pin 2))) -(net (code 3) (name "usb.usb.dp") - (node (ref J1) (pin A6)) - (node (ref J1) (pin B6))) -(net (code 4) (name "usb.usb.dm") - (node (ref J1) (pin A7)) - (node (ref J1) (pin B7))) -(net (code 5) (name "usb.conn.cc.cc1") - (node (ref J1) (pin A5)) - (node (ref R1) (pin 2))) -(net (code 6) (name "usb.conn.cc.cc2") - (node (ref J1) (pin B5)) - (node (ref R2) (pin 2))) -(net (code 7) (name "reg.pwr_out") - (node (ref R3) (pin 1)) - (node (ref L1) (pin 2)) - (node (ref C4) (pin 1)) - (node (ref U2) (pin 1)) - (node (ref U2) (pin 24)) - (node (ref U2) (pin 36)) - (node (ref U2) (pin 48)) - (node (ref U2) (pin 9)) - (node (ref C5) (pin 1)) - (node (ref C6) (pin 1)) - (node (ref C7) (pin 1)) - (node (ref C8) (pin 1)) - (node (ref C9) (pin 1)) - (node (ref C10) (pin 1)) - (node (ref J2) (pin 1))) -(net (code 8) (name "reg.ic.sw") - (node (ref U1) (pin 2)) - (node (ref C2) (pin 2)) - (node (ref L1) (pin 1))) -(net (code 9) (name "reg.ic.fb") - (node (ref U1) (pin 4)) - (node (ref R3) (pin 2)) - (node (ref R4) (pin 1))) -(net (code 10) (name "reg.ic.vbst") - (node (ref U1) (pin 6)) - (node (ref C2) (pin 1))) -(net (code 11) (name "mcu.swd_node.swdio") - (node (ref U2) (pin 34)) - (node (ref J2) (pin 2))) -(net (code 12) (name "mcu.swd_node.swclk") - (node (ref U2) (pin 37)) - (node (ref J2) (pin 4))) -(net (code 13) (name "mcu.reset_node") - (node (ref U2) (pin 7)) - (node (ref J2) (pin 10))) -(net (code 14) (name "mcu.ic.osc.xtal_in") - (node (ref U2) (pin 5))) -(net (code 15) (name "mcu.ic.osc.xtal_out") - (node (ref U2) (pin 6))) -(net (code 16) (name "mcu.swd.tdi") - (node (ref J2) (pin 8))) -(net (code 17) (name "mcu.swd.swo") - (node (ref J2) (pin 6))) -(net (code 18) (name "sw.out") - (node (ref U2) (pin 10)) - (node (ref SW1) (pin 1))) -(net (code 19) (name "led[0].signal") - (node (ref U2) (pin 11)) - (node (ref D1) (pin 2))) -(net (code 20) (name "led[0].package.k") - (node (ref D1) (pin 1)) - (node (ref R5) (pin 1))) -(net (code 21) (name "led[1].signal") - (node (ref U2) (pin 12)) - (node (ref D2) (pin 2))) -(net (code 22) (name "led[1].package.k") - (node (ref D2) (pin 1)) - (node (ref R6) (pin 1))) -(net (code 23) (name "led[2].signal") - (node (ref U2) (pin 13)) - (node (ref D3) (pin 2))) -(net (code 24) (name "led[2].package.k") - (node (ref D3) (pin 1)) - (node (ref R7) (pin 1))) -(net (code 25) (name "led[3].signal") - (node (ref U2) (pin 14)) - (node (ref D4) (pin 2))) -(net (code 26) (name "led[3].package.k") - (node (ref D4) (pin 1)) - (node (ref R8) (pin 1)))) -) \ No newline at end of file diff --git a/examples/TestBlinkyExpanded/TestBlinkyExpanded.svgpcb.js b/examples/TestBlinkyExpanded/TestBlinkyExpanded.svgpcb.js deleted file mode 100644 index 0131c90ca..000000000 --- a/examples/TestBlinkyExpanded/TestBlinkyExpanded.svgpcb.js +++ /dev/null @@ -1,211 +0,0 @@ -const board = new PCB(); - -// usb.conn -const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { - translate: pt(1.111, 0.165), rotate: 0, - id: 'J1' -}) -// usb.cc_pull.cc1 -const R1 = board.add(R_0603_1608Metric, { - translate: pt(0.960, 0.420), rotate: 0, - id: 'R1' -}) -// usb.cc_pull.cc2 -const R2 = board.add(R_0603_1608Metric, { - translate: pt(1.116, 0.420), rotate: 0, - id: 'R2' -}) -// reg.ic -const U1 = board.add(SOT_23_6, { - translate: pt(0.081, 0.804), rotate: 0, - id: 'U1' -}) -// reg.fb.div.top_res -const R3 = board.add(R_0603_1608Metric, { - translate: pt(0.058, 0.939), rotate: 0, - id: 'R3' -}) -// reg.fb.div.bottom_res -const R4 = board.add(R_0603_1608Metric, { - translate: pt(0.214, 0.939), rotate: 0, - id: 'R4' -}) -// reg.hf_in_cap.cap -const C1 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 0.939), rotate: 0, - id: 'C1' -}) -// reg.vbst_cap.cap -const C2 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 1.036), rotate: 0, - id: 'C2' -}) -// reg.power_path.inductor -const L1 = board.add(L_0603_1608Metric, { - translate: pt(0.214, 1.036), rotate: 0, - id: 'L1' -}) -// reg.power_path.in_cap.cap -const C3 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 1.036), rotate: 0, - id: 'C3' -}) -// reg.power_path.out_cap.cap -const C4 = board.add(C_0805_2012Metric, { - translate: pt(0.268, 0.776), rotate: 0, - id: 'C4' -}) -// mcu.ic -const U2 = board.add(LQFP_48_7x7mm_P0_5mm, { - translate: pt(0.203, 0.203), rotate: 0, - id: 'U2' -}) -// mcu.pwr_cap[0].cap -const C5 = board.add(C_0805_2012Metric, { - translate: pt(0.067, 0.483), rotate: 0, - id: 'C5' -}) -// mcu.pwr_cap[1].cap -const C6 = board.add(C_0603_1608Metric, { - translate: pt(0.231, 0.474), rotate: 0, - id: 'C6' -}) -// mcu.pwr_cap[2].cap -const C7 = board.add(C_0603_1608Metric, { - translate: pt(0.387, 0.474), rotate: 0, - id: 'C7' -}) -// mcu.pwr_cap[3].cap -const C8 = board.add(C_0603_1608Metric, { - translate: pt(0.543, 0.474), rotate: 0, - id: 'C8' -}) -// mcu.vdda_cap_0.cap -const C9 = board.add(C_0603_1608Metric, { - translate: pt(0.699, 0.474), rotate: 0, - id: 'C9' -}) -// mcu.vdda_cap_1.cap -const C10 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 0.590), rotate: 0, - id: 'C10' -}) -// mcu.swd.conn -const J2 = board.add(PinHeader_2x05_P1_27mm_Vertical_SMD, { - translate: pt(0.614, 0.146), rotate: 0, - id: 'J2' -}) -// sw.package -const SW1 = board.add(SW_SPST_SKQG_WithoutStem, { - translate: pt(0.714, 0.849), rotate: 0, - id: 'SW1' -}) -// led[0].package -const D1 = board.add(LED_0603_1608Metric, { - translate: pt(1.058, 0.766), rotate: 0, - id: 'D1' -}) -// led[0].res -const R5 = board.add(R_0603_1608Metric, { - translate: pt(1.057, 0.863), rotate: 0, - id: 'R5' -}) -// led[1].package -const D2 = board.add(LED_0603_1608Metric, { - translate: pt(1.293, 0.766), rotate: 0, - id: 'D2' -}) -// led[1].res -const R6 = board.add(R_0603_1608Metric, { - translate: pt(1.292, 0.863), rotate: 0, - id: 'R6' -}) -// led[2].package -const D3 = board.add(LED_0603_1608Metric, { - translate: pt(0.058, 1.212), rotate: 0, - id: 'D3' -}) -// led[2].res -const R7 = board.add(R_0603_1608Metric, { - translate: pt(0.058, 1.309), rotate: 0, - id: 'R7' -}) -// led[3].package -const D4 = board.add(LED_0603_1608Metric, { - translate: pt(0.293, 1.212), rotate: 0, - id: 'D4' -}) -// led[3].res -const R8 = board.add(R_0603_1608Metric, { - translate: pt(0.293, 1.309), rotate: 0, - id: 'R8' -}) - -board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["U1", "5"], ["C1", "1"], ["C3", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["R4", "2"], ["C1", "2"], ["C3", "2"], ["C4", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["SW1", "2"], ["R5", "2"], ["R6", "2"], ["R7", "2"], ["R8", "2"]]}, - {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"]]}, - {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"]]}, - {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, - {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, - {name: "reg.pwr_out", pads: [["R3", "1"], ["L1", "2"], ["C4", "1"], ["U2", "1"], ["U2", "24"], ["U2", "36"], ["U2", "48"], ["U2", "9"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["C8", "1"], ["C9", "1"], ["C10", "1"], ["J2", "1"]]}, - {name: "reg.ic.sw", pads: [["U1", "2"], ["C2", "2"], ["L1", "1"]]}, - {name: "reg.ic.fb", pads: [["U1", "4"], ["R3", "2"], ["R4", "1"]]}, - {name: "reg.ic.vbst", pads: [["U1", "6"], ["C2", "1"]]}, - {name: "mcu.swd_node.swdio", pads: [["U2", "34"], ["J2", "2"]]}, - {name: "mcu.swd_node.swclk", pads: [["U2", "37"], ["J2", "4"]]}, - {name: "mcu.reset_node", pads: [["U2", "7"], ["J2", "10"]]}, - {name: "mcu.ic.osc.xtal_in", pads: [["U2", "5"]]}, - {name: "mcu.ic.osc.xtal_out", pads: [["U2", "6"]]}, - {name: "mcu.swd.tdi", pads: [["J2", "8"]]}, - {name: "mcu.swd.swo", pads: [["J2", "6"]]}, - {name: "sw.out", pads: [["U2", "10"], ["SW1", "1"]]}, - {name: "led[0].signal", pads: [["U2", "11"], ["D1", "2"]]}, - {name: "led[0].package.k", pads: [["D1", "1"], ["R5", "1"]]}, - {name: "led[1].signal", pads: [["U2", "12"], ["D2", "2"]]}, - {name: "led[1].package.k", pads: [["D2", "1"], ["R6", "1"]]}, - {name: "led[2].signal", pads: [["U2", "13"], ["D3", "2"]]}, - {name: "led[2].package.k", pads: [["D3", "1"], ["R7", "1"]]}, - {name: "led[3].signal", pads: [["U2", "14"], ["D4", "2"]]}, - {name: "led[3].package.k", pads: [["D4", "1"], ["R8", "1"]]} -]) - -const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(1.4688976377952758, 1.455511811023622); -const xMin = Math.min(limit0[0], limit1[0]); -const xMax = Math.max(limit0[0], limit1[0]); -const yMin = Math.min(limit0[1], limit1[1]); -const yMax = Math.max(limit0[1], limit1[1]); - -const filletRadius = 0.1; -const outline = path( - [(xMin+xMax/2), yMax], - ["fillet", filletRadius, [xMax, yMax]], - ["fillet", filletRadius, [xMax, yMin]], - ["fillet", filletRadius, [xMin, yMin]], - ["fillet", filletRadius, [xMin, yMax]], - [(xMin+xMax/2), yMax], -); -board.addShape("outline", outline); - -renderPCB({ - pcb: board, - layerColors: { - "F.Paste": "#000000ff", - "F.Mask": "#000000ff", - "B.Mask": "#000000ff", - "componentLabels": "#00e5e5e5", - "outline": "#002d00ff", - "padLabels": "#ffff99e5", - "B.Cu": "#ef4e4eff", - "F.Cu": "#ff8c00cc", - }, - limits: { - x: [xMin, xMax], - y: [yMin, yMax] - }, - background: "#00000000", - mmPerUnit: 25.4 -}) - - diff --git a/examples/TestBlinkyImplicit/TestBlinkyImplicit.net.ref b/examples/TestBlinkyImplicit/TestBlinkyImplicit.net.ref index 21abf4314..09562dc7a 100644 --- a/examples/TestBlinkyImplicit/TestBlinkyImplicit.net.ref +++ b/examples/TestBlinkyImplicit/TestBlinkyImplicit.net.ref @@ -38,105 +38,45 @@ (tstamps "022400f9")) (comp (ref "U1") (value "reg.ic") - (footprint "Package_TO_SOT_SMD:SOT-23-6") + (footprint "Package_TO_SOT_SMD:SOT-223-3_TabPin2") (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) (property (name "edg_path") (value "reg.ic")) (property (name "edg_short_path") (value "reg.ic")) (property (name "edg_refdes") (value "U1")) - (property (name "edg_part") (value "TPS561201 (Texas Instruments)")) - (property (name "edg_value") (value "TPS561201")) + (property (name "edg_part") (value "AMS1117-3.3 (Advanced Monolithic Systems)")) + (property (name "edg_value") (value "AMS1117-3.3")) (sheetpath (names "/reg/") (tstamps "/028a013f/")) (tstamps "013700cd")) -(comp (ref "R3") - (value "reg.fb.top_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.top_res")) - (property (name "edg_short_path") (value "reg.fb.top_res")) - (property (name "edg_refdes") (value "R3")) - (property (name "edg_part") (value "0603WAF3302T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 33kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "0c0c02fd")) -(comp (ref "R4") - (value "reg.fb.bottom_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.bottom_res")) - (property (name "edg_short_path") (value "reg.fb.bottom_res")) - (property (name "edg_refdes") (value "R4")) - (property (name "edg_part") (value "0603WAF1002T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 10kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "175b043f")) (comp (ref "C1") - (value "reg.hf_in_cap") + (value "reg.in_cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.hf_in_cap.cap")) - (property (name "edg_short_path") (value "reg.hf_in_cap")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.in_cap.cap")) + (property (name "edg_short_path") (value "reg.in_cap")) (property (name "edg_refdes") (value "C1")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "11ed0398")) + (tstamps "0879026b")) (comp (ref "C2") - (value "reg.vbst_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") + (value "reg.out_cap") + (footprint "Capacitor_SMD:C_1206_3216Metric") (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.vbst_cap.cap")) - (property (name "edg_short_path") (value "reg.vbst_cap")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.out_cap.cap")) + (property (name "edg_short_path") (value "reg.out_cap")) (property (name "edg_refdes") (value "C2")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (property (name "edg_part") (value "CL31A226KPHNNNE (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "10V 22uF X5R ±10% 1206 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "0f330353")) -(comp (ref "L1") - (value "reg.power_path.inductor") - (footprint "Inductor_SMD:L_0603_1608Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.inductor")) - (property (name "edg_short_path") (value "reg.power_path.inductor")) - (property (name "edg_refdes") (value "L1")) - (property (name "edg_part") (value "MGFL1608F6R8MT-LF (microgate)")) - (property (name "edg_value") (value "400mA 6.8uH ±20% 530mΩ 0603 Inductors (SMD) ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0f2b0369")) -(comp (ref "C3") - (value "reg.power_path.in_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.in_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.in_cap")) - (property (name "edg_refdes") (value "C3")) - (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0879026b")) -(comp (ref "C4") - (value "reg.power_path.out_cap") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.out_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.out_cap")) - (property (name "edg_refdes") (value "C4")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) (tstamps "0be902ec")) (comp (ref "U2") (value "mcu.ic") (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.ic")) (property (name "edg_short_path") (value "mcu.ic")) (property (name "edg_refdes") (value "U2")) @@ -144,83 +84,119 @@ (property (name "edg_value") (value "STM32F103xxT6")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) (tstamps "013700cd")) -(comp (ref "C5") +(comp (ref "C3") (value "mcu.pwr_cap[0]") (footprint "Capacitor_SMD:C_0805_2012Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) - (property (name "edg_refdes") (value "C5")) + (property (name "edg_refdes") (value "C3")) (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) (tstamps "168703d5")) -(comp (ref "C6") +(comp (ref "C4") (value "mcu.pwr_cap[1]") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) - (property (name "edg_refdes") (value "C6")) + (property (name "edg_refdes") (value "C4")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) (tstamps "168903d6")) -(comp (ref "C7") +(comp (ref "C5") (value "mcu.pwr_cap[2]") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) - (property (name "edg_refdes") (value "C7")) + (property (name "edg_refdes") (value "C5")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) (tstamps "168b03d7")) -(comp (ref "C8") +(comp (ref "C6") (value "mcu.pwr_cap[3]") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) - (property (name "edg_refdes") (value "C8")) + (property (name "edg_refdes") (value "C6")) (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) (tstamps "168d03d8")) -(comp (ref "C9") +(comp (ref "C7") (value "mcu.vdda_cap_0") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) (property (name "edg_short_path") (value "mcu.vdda_cap_0")) - (property (name "edg_refdes") (value "C9")) + (property (name "edg_refdes") (value "C7")) (property (name "edg_part") (value "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))")) (property (name "edg_value") (value "50V 10nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) (tstamps "15dc03c2")) -(comp (ref "C10") +(comp (ref "C8") (value "mcu.vdda_cap_1") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) (property (name "edg_short_path") (value "mcu.vdda_cap_1")) - (property (name "edg_refdes") (value "C10")) + (property (name "edg_refdes") (value "C8")) (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) (tstamps "15dd03c3")) +(comp (ref "X1") + (value "mcu.crystal.package") + (footprint "Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.package")) + (property (name "edg_short_path") (value "mcu.crystal.package")) + (property (name "edg_refdes") (value "X1")) + (property (name "edg_part") (value "X32258MOB4SI (Yangxing Tech)")) + (property (name "edg_value") (value "8MHz SMD Crystal Resonator 12pF ±10ppm ±30ppm -40℃~+85℃ SMD3225-4P Crystals ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "0b4e02cd")) +(comp (ref "C9") + (value "mcu.crystal.cap_a") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.cap_a")) + (property (name "edg_short_path") (value "mcu.crystal.cap_a")) + (property (name "edg_refdes") (value "C9")) + (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "05e701f5")) +(comp (ref "C10") + (value "mcu.crystal.cap_b") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.cap_b")) + (property (name "edg_short_path") (value "mcu.crystal.cap_b")) + (property (name "edg_refdes") (value "C10")) + (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "05e801f6")) (comp (ref "J2") (value "mcu.swd") (footprint "Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.swd.conn")) (property (name "edg_short_path") (value "mcu.swd")) (property (name "edg_refdes") (value "J2")) @@ -228,114 +204,354 @@ (property (name "edg_value") (value "PinHeader1.27 Shrouded 2x5")) (sheetpath (names "/mcu/") (tstamps "/02850146/")) (tstamps "02ae014f")) -(comp (ref "SW1") - (value "sw") - (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") - (property (name "Sheetname") (value "")) - (property (name "Sheetfile") (value "")) - (property (name "edg_path") (value "sw.package")) - (property (name "edg_short_path") (value "sw")) - (property (name "edg_refdes") (value "SW1")) - (property (name "edg_part") (value "5.1mm switch")) - (property (name "edg_value") (value "5.1mm switch")) - (sheetpath (names "/") (tstamps "/")) - (tstamps "015f00eb")) +(comp (ref "R3") + (value "mcu.usb_pull") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.usb_pull.dp")) + (property (name "edg_short_path") (value "mcu.usb_pull")) + (property (name "edg_refdes") (value "R3")) + (property (name "edg_part") (value "0603WAF1501T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1.5kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "0f5f0367")) (comp (ref "D1") - (value "led[0].package") + (value "led.package") (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[0]")) + (property (name "Sheetname") (value "led")) (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[0].package")) - (property (name "edg_short_path") (value "led[0].package")) + (property (name "edg_path") (value "led.package")) + (property (name "edg_short_path") (value "led.package")) (property (name "edg_refdes") (value "D1")) (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[0]/") (tstamps "/07e5021e/")) + (sheetpath (names "/led/") (tstamps "/02750136/")) (tstamps "0b4e02cd")) -(comp (ref "R5") - (value "led[0].res") +(comp (ref "R4") + (value "led.res") (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[0]")) + (property (name "Sheetname") (value "led")) (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[0].res")) - (property (name "edg_short_path") (value "led[0].res")) - (property (name "edg_refdes") (value "R5")) + (property (name "edg_path") (value "led.res")) + (property (name "edg_short_path") (value "led.res")) + (property (name "edg_refdes") (value "R4")) (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[0]/") (tstamps "/07e5021e/")) + (sheetpath (names "/led/") (tstamps "/02750136/")) (tstamps "0296014b")) +(comp (ref "SW1") + (value "sw.sw[0,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,0].sw")) + (property (name "edg_short_path") (value "sw.sw[0,0].sw")) + (property (name "edg_refdes") (value "SW1")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "015f00eb")) (comp (ref "D2") - (value "led[1].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[1]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[1].package")) - (property (name "edg_short_path") (value "led[1].package")) + (value "sw.sw[0,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,0].d")) + (property (name "edg_short_path") (value "sw.sw[0,0].d")) (property (name "edg_refdes") (value "D2")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[1]/") (tstamps "/07e7021f/")) - (tstamps "0b4e02cd")) -(comp (ref "R6") - (value "led[1].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[1]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[1].res")) - (property (name "edg_short_path") (value "led[1].res")) - (property (name "edg_refdes") (value "R6")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[1]/") (tstamps "/07e7021f/")) - (tstamps "0296014b")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "00650065")) (comp (ref "D3") - (value "led[2].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[2]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[2].package")) - (property (name "edg_short_path") (value "led[2].package")) + (value "sw.sw[0,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,0].npx.device")) (property (name "edg_refdes") (value "D3")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[2]/") (tstamps "/07e90220/")) - (tstamps "0b4e02cd")) -(comp (ref "R7") - (value "led[2].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[2]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[2].res")) - (property (name "edg_short_path") (value "led[2].res")) - (property (name "edg_refdes") (value "R7")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[2]/") (tstamps "/07e90220/")) - (tstamps "0296014b")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) + (tstamps "08950271")) +(comp (ref "C11") + (value "sw.sw[0,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,0].npx.cap")) + (property (name "edg_refdes") (value "C11")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW2") + (value "sw.sw[1,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,0].sw")) + (property (name "edg_short_path") (value "sw.sw[1,0].sw")) + (property (name "edg_refdes") (value "SW2")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "015f00eb")) (comp (ref "D4") - (value "led[3].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[3]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[3].package")) - (property (name "edg_short_path") (value "led[3].package")) + (value "sw.sw[1,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,0].d")) + (property (name "edg_short_path") (value "sw.sw[1,0].d")) (property (name "edg_refdes") (value "D4")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[3]/") (tstamps "/07eb0221/")) - (tstamps "0b4e02cd")) -(comp (ref "R8") - (value "led[3].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[3]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[3].res")) - (property (name "edg_short_path") (value "led[3].res")) - (property (name "edg_refdes") (value "R8")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[3]/") (tstamps "/07eb0221/")) - (tstamps "0296014b"))) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "00650065")) +(comp (ref "D5") + (value "sw.sw[1,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,0].npx.device")) + (property (name "edg_refdes") (value "D5")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) + (tstamps "08950271")) +(comp (ref "C12") + (value "sw.sw[1,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,0].npx.cap")) + (property (name "edg_refdes") (value "C12")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW3") + (value "sw.sw[0,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,1].sw")) + (property (name "edg_short_path") (value "sw.sw[0,1].sw")) + (property (name "edg_refdes") (value "SW3")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "015f00eb")) +(comp (ref "D6") + (value "sw.sw[0,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,1].d")) + (property (name "edg_short_path") (value "sw.sw[0,1].d")) + (property (name "edg_refdes") (value "D6")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "00650065")) +(comp (ref "D7") + (value "sw.sw[0,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,1].npx.device")) + (property (name "edg_refdes") (value "D7")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) + (tstamps "08950271")) +(comp (ref "C13") + (value "sw.sw[0,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,1].npx.cap")) + (property (name "edg_refdes") (value "C13")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW4") + (value "sw.sw[1,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,1].sw")) + (property (name "edg_short_path") (value "sw.sw[1,1].sw")) + (property (name "edg_refdes") (value "SW4")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "015f00eb")) +(comp (ref "D8") + (value "sw.sw[1,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,1].d")) + (property (name "edg_short_path") (value "sw.sw[1,1].d")) + (property (name "edg_refdes") (value "D8")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "00650065")) +(comp (ref "D9") + (value "sw.sw[1,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,1].npx.device")) + (property (name "edg_refdes") (value "D9")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) + (tstamps "08950271")) +(comp (ref "C14") + (value "sw.sw[1,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,1].npx.cap")) + (property (name "edg_refdes") (value "C14")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW5") + (value "sw.sw[0,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,2].sw")) + (property (name "edg_short_path") (value "sw.sw[0,2].sw")) + (property (name "edg_refdes") (value "SW5")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "015f00eb")) +(comp (ref "D10") + (value "sw.sw[0,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,2].d")) + (property (name "edg_short_path") (value "sw.sw[0,2].d")) + (property (name "edg_refdes") (value "D10")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "00650065")) +(comp (ref "D11") + (value "sw.sw[0,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,2].npx.device")) + (property (name "edg_refdes") (value "D11")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) + (tstamps "08950271")) +(comp (ref "C15") + (value "sw.sw[0,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,2].npx.cap")) + (property (name "edg_refdes") (value "C15")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW6") + (value "sw.sw[1,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,2].sw")) + (property (name "edg_short_path") (value "sw.sw[1,2].sw")) + (property (name "edg_refdes") (value "SW6")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "015f00eb")) +(comp (ref "D12") + (value "sw.sw[1,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,2].d")) + (property (name "edg_short_path") (value "sw.sw[1,2].d")) + (property (name "edg_refdes") (value "D12")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "00650065")) +(comp (ref "D13") + (value "sw.sw[1,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,2].npx.device")) + (property (name "edg_refdes") (value "D13")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) + (tstamps "08950271")) +(comp (ref "C16") + (value "sw.sw[1,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,2].npx.cap")) + (property (name "edg_refdes") (value "C16")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) + (tstamps "025e0135")) +(comp (ref "U3") + (value "npx_shift.ic") + (footprint "Package_TO_SOT_SMD:SOT-23-5") + (property (name "Sheetname") (value "npx_shift")) + (property (name "Sheetfile") (value "edg.parts.logic.Logic_74Ahct.L74Ahct1g125")) + (property (name "edg_path") (value "npx_shift.ic")) + (property (name "edg_short_path") (value "npx_shift.ic")) + (property (name "edg_refdes") (value "U3")) + (property (name "edg_part") (value "74AHCT1G125W5-7 (Diodes Incorporated)")) + (property (name "edg_value") (value "74AHCT1G125W5-7")) + (sheetpath (names "/npx_shift/") (tstamps "/134303d4/")) + (tstamps "013700cd")) +(comp (ref "C17") + (value "npx_shift.vdd_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx_shift")) + (property (name "Sheetfile") (value "edg.parts.logic.Logic_74Ahct.L74Ahct1g125")) + (property (name "edg_path") (value "npx_shift.vdd_cap.cap")) + (property (name "edg_short_path") (value "npx_shift.vdd_cap")) + (property (name "edg_refdes") (value "C17")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/npx_shift/") (tstamps "/134303d4/")) + (tstamps "0b6402d2"))) (nets (net (code 1) (name "usb.pwr") (node (ref J1) (pin A4)) @@ -343,9 +559,21 @@ (node (ref J1) (pin B4)) (node (ref J1) (pin B9)) (node (ref U1) (pin 3)) - (node (ref U1) (pin 5)) (node (ref C1) (pin 1)) - (node (ref C3) (pin 1))) + (node (ref D3) (pin 1)) + (node (ref C11) (pin 1)) + (node (ref D5) (pin 1)) + (node (ref C12) (pin 1)) + (node (ref D7) (pin 1)) + (node (ref C13) (pin 1)) + (node (ref D9) (pin 1)) + (node (ref C14) (pin 1)) + (node (ref D11) (pin 1)) + (node (ref C15) (pin 1)) + (node (ref D13) (pin 1)) + (node (ref C16) (pin 1)) + (node (ref U3) (pin 5)) + (node (ref C17) (pin 1))) (net (code 2) (name "usb.gnd") (node (ref J1) (pin A1)) (node (ref J1) (pin A12)) @@ -355,35 +583,51 @@ (node (ref R1) (pin 1)) (node (ref R2) (pin 1)) (node (ref U1) (pin 1)) - (node (ref R4) (pin 2)) (node (ref C1) (pin 2)) - (node (ref C3) (pin 2)) - (node (ref C4) (pin 2)) + (node (ref C2) (pin 2)) (node (ref U2) (pin 23)) (node (ref U2) (pin 35)) (node (ref U2) (pin 44)) (node (ref U2) (pin 47)) (node (ref U2) (pin 8)) + (node (ref C3) (pin 2)) + (node (ref C4) (pin 2)) (node (ref C5) (pin 2)) (node (ref C6) (pin 2)) (node (ref C7) (pin 2)) (node (ref C8) (pin 2)) + (node (ref X1) (pin 2)) + (node (ref X1) (pin 4)) (node (ref C9) (pin 2)) (node (ref C10) (pin 2)) (node (ref J2) (pin 3)) (node (ref J2) (pin 5)) (node (ref J2) (pin 9)) - (node (ref SW1) (pin 2)) - (node (ref R5) (pin 2)) - (node (ref R6) (pin 2)) - (node (ref R7) (pin 2)) - (node (ref R8) (pin 2))) + (node (ref R4) (pin 2)) + (node (ref D3) (pin 3)) + (node (ref C11) (pin 2)) + (node (ref D5) (pin 3)) + (node (ref C12) (pin 2)) + (node (ref D7) (pin 3)) + (node (ref C13) (pin 2)) + (node (ref D9) (pin 3)) + (node (ref C14) (pin 2)) + (node (ref D11) (pin 3)) + (node (ref C15) (pin 2)) + (node (ref D13) (pin 3)) + (node (ref C16) (pin 2)) + (node (ref U3) (pin 1)) + (node (ref U3) (pin 3)) + (node (ref C17) (pin 2))) (net (code 3) (name "usb.usb.dp") (node (ref J1) (pin A6)) - (node (ref J1) (pin B6))) + (node (ref J1) (pin B6)) + (node (ref U2) (pin 33)) + (node (ref R3) (pin 2))) (net (code 4) (name "usb.usb.dm") (node (ref J1) (pin A7)) - (node (ref J1) (pin B7))) + (node (ref J1) (pin B7)) + (node (ref U2) (pin 32))) (net (code 5) (name "usb.conn.cc.cc1") (node (ref J1) (pin A5)) (node (ref R1) (pin 2))) @@ -391,74 +635,109 @@ (node (ref J1) (pin B5)) (node (ref R2) (pin 2))) (net (code 7) (name "reg.pwr_out") - (node (ref R3) (pin 1)) - (node (ref L1) (pin 2)) - (node (ref C4) (pin 1)) + (node (ref U1) (pin 2)) + (node (ref C2) (pin 1)) (node (ref U2) (pin 1)) (node (ref U2) (pin 24)) (node (ref U2) (pin 36)) (node (ref U2) (pin 48)) (node (ref U2) (pin 9)) + (node (ref C3) (pin 1)) + (node (ref C4) (pin 1)) (node (ref C5) (pin 1)) (node (ref C6) (pin 1)) (node (ref C7) (pin 1)) (node (ref C8) (pin 1)) - (node (ref C9) (pin 1)) - (node (ref C10) (pin 1)) - (node (ref J2) (pin 1))) -(net (code 8) (name "reg.ic.sw") - (node (ref U1) (pin 2)) - (node (ref C2) (pin 2)) - (node (ref L1) (pin 1))) -(net (code 9) (name "reg.ic.fb") - (node (ref U1) (pin 4)) - (node (ref R3) (pin 2)) - (node (ref R4) (pin 1))) -(net (code 10) (name "reg.ic.vbst") - (node (ref U1) (pin 6)) - (node (ref C2) (pin 1))) -(net (code 11) (name "mcu.swd_node.swdio") + (node (ref J2) (pin 1)) + (node (ref R3) (pin 1))) +(net (code 8) (name "mcu.gpio.cols_0") + (node (ref U2) (pin 12)) + (node (ref SW1) (pin 1)) + (node (ref SW3) (pin 1)) + (node (ref SW5) (pin 1))) +(net (code 9) (name "mcu.gpio.cols_1") + (node (ref U2) (pin 13)) + (node (ref SW2) (pin 1)) + (node (ref SW4) (pin 1)) + (node (ref SW6) (pin 1))) +(net (code 10) (name "mcu.gpio.rows_0") + (node (ref U2) (pin 14)) + (node (ref D2) (pin 1)) + (node (ref D4) (pin 1))) +(net (code 11) (name "mcu.gpio.rows_1") + (node (ref U2) (pin 15)) + (node (ref D6) (pin 1)) + (node (ref D8) (pin 1))) +(net (code 12) (name "mcu.gpio.rows_2") + (node (ref U2) (pin 16)) + (node (ref D10) (pin 1)) + (node (ref D12) (pin 1))) +(net (code 13) (name "mcu.xtal_node.xi") + (node (ref U2) (pin 5)) + (node (ref X1) (pin 1)) + (node (ref C9) (pin 1))) +(net (code 14) (name "mcu.xtal_node.xo") + (node (ref U2) (pin 6)) + (node (ref X1) (pin 3)) + (node (ref C10) (pin 1))) +(net (code 15) (name "mcu.swd_node.swdio") (node (ref U2) (pin 34)) (node (ref J2) (pin 2))) -(net (code 12) (name "mcu.swd_node.swclk") +(net (code 16) (name "mcu.swd_node.swclk") (node (ref U2) (pin 37)) (node (ref J2) (pin 4))) -(net (code 13) (name "mcu.reset_node") +(net (code 17) (name "mcu.reset_node") (node (ref U2) (pin 7)) (node (ref J2) (pin 10))) -(net (code 14) (name "mcu.ic.osc.xtal_in") - (node (ref U2) (pin 5))) -(net (code 15) (name "mcu.ic.osc.xtal_out") - (node (ref U2) (pin 6))) -(net (code 16) (name "mcu.swd.tdi") +(net (code 18) (name "mcu.swd.tdi") (node (ref J2) (pin 8))) -(net (code 17) (name "mcu.swd.swo") +(net (code 19) (name "mcu.swd.swo") (node (ref J2) (pin 6))) -(net (code 18) (name "sw.out") +(net (code 20) (name "led.signal") (node (ref U2) (pin 10)) - (node (ref SW1) (pin 1))) -(net (code 19) (name "led[0].signal") - (node (ref U2) (pin 11)) (node (ref D1) (pin 2))) -(net (code 20) (name "led[0].package.k") +(net (code 21) (name "led.package.k") (node (ref D1) (pin 1)) - (node (ref R5) (pin 1))) -(net (code 21) (name "led[1].signal") - (node (ref U2) (pin 12)) + (node (ref R4) (pin 1))) +(net (code 22) (name "sw.npx_din") + (node (ref D3) (pin 4)) + (node (ref U3) (pin 4))) +(net (code 23) (name "sw.npx_dout") + (node (ref D13) (pin 2))) +(net (code 24) (name "sw.sw[0,0].npx_dout") + (node (ref D3) (pin 2)) + (node (ref D5) (pin 4))) +(net (code 25) (name "sw.sw[0,0].sw.com") + (node (ref SW1) (pin 2)) (node (ref D2) (pin 2))) -(net (code 22) (name "led[1].package.k") - (node (ref D2) (pin 1)) - (node (ref R6) (pin 1))) -(net (code 23) (name "led[2].signal") - (node (ref U2) (pin 13)) - (node (ref D3) (pin 2))) -(net (code 24) (name "led[2].package.k") - (node (ref D3) (pin 1)) - (node (ref R7) (pin 1))) -(net (code 25) (name "led[3].signal") - (node (ref U2) (pin 14)) +(net (code 26) (name "sw.sw[1,0].npx_dout") + (node (ref D5) (pin 2)) + (node (ref D9) (pin 4))) +(net (code 27) (name "sw.sw[1,0].sw.com") + (node (ref SW2) (pin 2)) (node (ref D4) (pin 2))) -(net (code 26) (name "led[3].package.k") - (node (ref D4) (pin 1)) - (node (ref R8) (pin 1)))) +(net (code 28) (name "sw.sw[0,1].npx_din") + (node (ref D7) (pin 4)) + (node (ref D9) (pin 2))) +(net (code 29) (name "sw.sw[0,1].npx_dout") + (node (ref D7) (pin 2)) + (node (ref D11) (pin 4))) +(net (code 30) (name "sw.sw[0,1].sw.com") + (node (ref SW3) (pin 2)) + (node (ref D6) (pin 2))) +(net (code 31) (name "sw.sw[1,1].sw.com") + (node (ref SW4) (pin 2)) + (node (ref D8) (pin 2))) +(net (code 32) (name "sw.sw[0,2].npx_dout") + (node (ref D11) (pin 2)) + (node (ref D13) (pin 4))) +(net (code 33) (name "sw.sw[0,2].sw.com") + (node (ref SW5) (pin 2)) + (node (ref D10) (pin 2))) +(net (code 34) (name "sw.sw[1,2].sw.com") + (node (ref SW6) (pin 2)) + (node (ref D12) (pin 2))) +(net (code 35) (name "npx_shift.input") + (node (ref U2) (pin 11)) + (node (ref U3) (pin 2)))) ) \ No newline at end of file diff --git a/examples/TestBlinkyImplicit/TestBlinkyImplicit.svgpcb.js b/examples/TestBlinkyImplicit/TestBlinkyImplicit.svgpcb.js index 0131c90ca..cf479b36c 100644 --- a/examples/TestBlinkyImplicit/TestBlinkyImplicit.svgpcb.js +++ b/examples/TestBlinkyImplicit/TestBlinkyImplicit.svgpcb.js @@ -1,177 +1,157 @@ const board = new PCB(); +const sw = SwitchDiodeMatrixNeopixels_2_3_sw(pt(0.039, 0.039)) // usb.conn const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { - translate: pt(1.111, 0.165), rotate: 0, + translate: pt(2.252, 0.165), rotate: 0, id: 'J1' }) // usb.cc_pull.cc1 const R1 = board.add(R_0603_1608Metric, { - translate: pt(0.960, 0.420), rotate: 0, + translate: pt(2.101, 0.420), rotate: 0, id: 'R1' }) // usb.cc_pull.cc2 const R2 = board.add(R_0603_1608Metric, { - translate: pt(1.116, 0.420), rotate: 0, + translate: pt(2.257, 0.420), rotate: 0, id: 'R2' }) // reg.ic -const U1 = board.add(SOT_23_6, { - translate: pt(0.081, 0.804), rotate: 0, +const U1 = board.add(SOT_223_3_TabPin2, { + translate: pt(1.291, 0.935), rotate: 0, id: 'U1' }) -// reg.fb.div.top_res -const R3 = board.add(R_0603_1608Metric, { - translate: pt(0.058, 0.939), rotate: 0, - id: 'R3' -}) -// reg.fb.div.bottom_res -const R4 = board.add(R_0603_1608Metric, { - translate: pt(0.214, 0.939), rotate: 0, - id: 'R4' -}) -// reg.hf_in_cap.cap +// reg.in_cap.cap const C1 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 0.939), rotate: 0, + translate: pt(1.397, 1.145), rotate: 0, id: 'C1' }) -// reg.vbst_cap.cap -const C2 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 1.036), rotate: 0, +// reg.out_cap.cap +const C2 = board.add(C_1206_3216Metric, { + translate: pt(1.209, 1.162), rotate: 0, id: 'C2' }) -// reg.power_path.inductor -const L1 = board.add(L_0603_1608Metric, { - translate: pt(0.214, 1.036), rotate: 0, - id: 'L1' -}) -// reg.power_path.in_cap.cap -const C3 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 1.036), rotate: 0, - id: 'C3' -}) -// reg.power_path.out_cap.cap -const C4 = board.add(C_0805_2012Metric, { - translate: pt(0.268, 0.776), rotate: 0, - id: 'C4' -}) // mcu.ic const U2 = board.add(LQFP_48_7x7mm_P0_5mm, { - translate: pt(0.203, 0.203), rotate: 0, + translate: pt(1.321, 0.203), rotate: 0, id: 'U2' }) // mcu.pwr_cap[0].cap -const C5 = board.add(C_0805_2012Metric, { - translate: pt(0.067, 0.483), rotate: 0, - id: 'C5' +const C3 = board.add(C_0805_2012Metric, { + translate: pt(1.390, 0.483), rotate: 0, + id: 'C3' }) // mcu.pwr_cap[1].cap +const C4 = board.add(C_0603_1608Metric, { + translate: pt(1.554, 0.474), rotate: 0, + id: 'C4' +}) +// mcu.pwr_cap[2].cap +const C5 = board.add(C_0603_1608Metric, { + translate: pt(1.710, 0.474), rotate: 0, + id: 'C5' +}) +// mcu.pwr_cap[3].cap const C6 = board.add(C_0603_1608Metric, { - translate: pt(0.231, 0.474), rotate: 0, + translate: pt(1.866, 0.474), rotate: 0, id: 'C6' }) -// mcu.pwr_cap[2].cap +// mcu.vdda_cap_0.cap const C7 = board.add(C_0603_1608Metric, { - translate: pt(0.387, 0.474), rotate: 0, + translate: pt(1.176, 0.647), rotate: 0, id: 'C7' }) -// mcu.pwr_cap[3].cap +// mcu.vdda_cap_1.cap const C8 = board.add(C_0603_1608Metric, { - translate: pt(0.543, 0.474), rotate: 0, + translate: pt(1.332, 0.647), rotate: 0, id: 'C8' }) -// mcu.vdda_cap_0.cap +// mcu.crystal.package +const X1 = board.add(Crystal_SMD_3225_4Pin_3_2x2_5mm, { + translate: pt(1.201, 0.512), rotate: 0, + id: 'X1' +}) +// mcu.crystal.cap_a const C9 = board.add(C_0603_1608Metric, { - translate: pt(0.699, 0.474), rotate: 0, + translate: pt(1.488, 0.647), rotate: 0, id: 'C9' }) -// mcu.vdda_cap_1.cap +// mcu.crystal.cap_b const C10 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 0.590), rotate: 0, + translate: pt(1.644, 0.647), rotate: 0, id: 'C10' }) // mcu.swd.conn const J2 = board.add(PinHeader_2x05_P1_27mm_Vertical_SMD, { - translate: pt(0.614, 0.146), rotate: 0, + translate: pt(1.732, 0.146), rotate: 0, id: 'J2' }) -// sw.package -const SW1 = board.add(SW_SPST_SKQG_WithoutStem, { - translate: pt(0.714, 0.849), rotate: 0, - id: 'SW1' +// mcu.usb_pull.dp +const R3 = board.add(R_0603_1608Metric, { + translate: pt(1.800, 0.647), rotate: 0, + id: 'R3' }) -// led[0].package +// led.package const D1 = board.add(LED_0603_1608Metric, { - translate: pt(1.058, 0.766), rotate: 0, + translate: pt(1.921, 0.823), rotate: 0, id: 'D1' }) -// led[0].res -const R5 = board.add(R_0603_1608Metric, { - translate: pt(1.057, 0.863), rotate: 0, - id: 'R5' -}) -// led[1].package -const D2 = board.add(LED_0603_1608Metric, { - translate: pt(1.293, 0.766), rotate: 0, - id: 'D2' -}) -// led[1].res -const R6 = board.add(R_0603_1608Metric, { - translate: pt(1.292, 0.863), rotate: 0, - id: 'R6' -}) -// led[2].package -const D3 = board.add(LED_0603_1608Metric, { - translate: pt(0.058, 1.212), rotate: 0, - id: 'D3' -}) -// led[2].res -const R7 = board.add(R_0603_1608Metric, { - translate: pt(0.058, 1.309), rotate: 0, - id: 'R7' +// led.res +const R4 = board.add(R_0603_1608Metric, { + translate: pt(1.920, 0.920), rotate: 0, + id: 'R4' }) -// led[3].package -const D4 = board.add(LED_0603_1608Metric, { - translate: pt(0.293, 1.212), rotate: 0, - id: 'D4' +// npx_shift.ic +const U3 = board.add(SOT_23_5, { + translate: pt(1.663, 0.861), rotate: 0, + id: 'U3' }) -// led[3].res -const R8 = board.add(R_0603_1608Metric, { - translate: pt(0.293, 1.309), rotate: 0, - id: 'R8' +// npx_shift.vdd_cap.cap +const C17 = board.add(C_0603_1608Metric, { + translate: pt(1.641, 0.996), rotate: 0, + id: 'C17' }) board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["U1", "5"], ["C1", "1"], ["C3", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["R4", "2"], ["C1", "2"], ["C3", "2"], ["C4", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["SW1", "2"], ["R5", "2"], ["R6", "2"], ["R7", "2"], ["R8", "2"]]}, - {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"]]}, - {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"]]}, + {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "1"], ["C11", "1"], ["D5", "1"], ["C12", "1"], ["D7", "1"], ["C13", "1"], ["D9", "1"], ["C14", "1"], ["D11", "1"], ["C15", "1"], ["D13", "1"], ["C16", "1"], ["U3", "5"], ["C17", "1"]]}, + {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"], ["D3", "3"], ["C11", "2"], ["D5", "3"], ["C12", "2"], ["D7", "3"], ["C13", "2"], ["D9", "3"], ["C14", "2"], ["D11", "3"], ["C15", "2"], ["D13", "3"], ["C16", "2"], ["U3", "1"], ["U3", "3"], ["C17", "2"]]}, + {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "33"], ["R3", "2"]]}, + {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "32"]]}, {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, - {name: "reg.pwr_out", pads: [["R3", "1"], ["L1", "2"], ["C4", "1"], ["U2", "1"], ["U2", "24"], ["U2", "36"], ["U2", "48"], ["U2", "9"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["C8", "1"], ["C9", "1"], ["C10", "1"], ["J2", "1"]]}, - {name: "reg.ic.sw", pads: [["U1", "2"], ["C2", "2"], ["L1", "1"]]}, - {name: "reg.ic.fb", pads: [["U1", "4"], ["R3", "2"], ["R4", "1"]]}, - {name: "reg.ic.vbst", pads: [["U1", "6"], ["C2", "1"]]}, + {name: "reg.pwr_out", pads: [["U1", "2"], ["C2", "1"], ["U2", "1"], ["U2", "24"], ["U2", "36"], ["U2", "48"], ["U2", "9"], ["C3", "1"], ["C4", "1"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["C8", "1"], ["J2", "1"], ["R3", "1"]]}, + {name: "mcu.gpio.cols_0", pads: [["U2", "12"], ["SW1", "1"], ["SW3", "1"], ["SW5", "1"]]}, + {name: "mcu.gpio.cols_1", pads: [["U2", "13"], ["SW2", "1"], ["SW4", "1"], ["SW6", "1"]]}, + {name: "mcu.gpio.rows_0", pads: [["U2", "14"], ["D2", "1"], ["D4", "1"]]}, + {name: "mcu.gpio.rows_1", pads: [["U2", "15"], ["D6", "1"], ["D8", "1"]]}, + {name: "mcu.gpio.rows_2", pads: [["U2", "16"], ["D10", "1"], ["D12", "1"]]}, + {name: "mcu.xtal_node.xi", pads: [["U2", "5"], ["X1", "1"], ["C9", "1"]]}, + {name: "mcu.xtal_node.xo", pads: [["U2", "6"], ["X1", "3"], ["C10", "1"]]}, {name: "mcu.swd_node.swdio", pads: [["U2", "34"], ["J2", "2"]]}, {name: "mcu.swd_node.swclk", pads: [["U2", "37"], ["J2", "4"]]}, {name: "mcu.reset_node", pads: [["U2", "7"], ["J2", "10"]]}, - {name: "mcu.ic.osc.xtal_in", pads: [["U2", "5"]]}, - {name: "mcu.ic.osc.xtal_out", pads: [["U2", "6"]]}, {name: "mcu.swd.tdi", pads: [["J2", "8"]]}, {name: "mcu.swd.swo", pads: [["J2", "6"]]}, - {name: "sw.out", pads: [["U2", "10"], ["SW1", "1"]]}, - {name: "led[0].signal", pads: [["U2", "11"], ["D1", "2"]]}, - {name: "led[0].package.k", pads: [["D1", "1"], ["R5", "1"]]}, - {name: "led[1].signal", pads: [["U2", "12"], ["D2", "2"]]}, - {name: "led[1].package.k", pads: [["D2", "1"], ["R6", "1"]]}, - {name: "led[2].signal", pads: [["U2", "13"], ["D3", "2"]]}, - {name: "led[2].package.k", pads: [["D3", "1"], ["R7", "1"]]}, - {name: "led[3].signal", pads: [["U2", "14"], ["D4", "2"]]}, - {name: "led[3].package.k", pads: [["D4", "1"], ["R8", "1"]]} + {name: "led.signal", pads: [["U2", "10"], ["D1", "2"]]}, + {name: "led.package.k", pads: [["D1", "1"], ["R4", "1"]]}, + {name: "sw.npx_din", pads: [["D3", "4"], ["U3", "4"]]}, + {name: "sw.npx_dout", pads: [["D13", "2"]]}, + {name: "sw.sw[0,0].npx_dout", pads: [["D3", "2"], ["D5", "4"]]}, + {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, + {name: "sw.sw[1,0].npx_dout", pads: [["D5", "2"], ["D9", "4"]]}, + {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D4", "2"]]}, + {name: "sw.sw[0,1].npx_din", pads: [["D7", "4"], ["D9", "2"]]}, + {name: "sw.sw[0,1].npx_dout", pads: [["D7", "2"], ["D11", "4"]]}, + {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D6", "2"]]}, + {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D8", "2"]]}, + {name: "sw.sw[0,2].npx_dout", pads: [["D11", "2"], ["D13", "4"]]}, + {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D10", "2"]]}, + {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D12", "2"]]}, + {name: "npx_shift.input", pads: [["U2", "11"], ["U3", "2"]]} ]) const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(1.4688976377952758, 1.455511811023622); +const limit1 = pt(2.5795275590551188, 2.1181102362204722); const xMin = Math.min(limit0[0], limit1[0]); const xMax = Math.max(limit0[0], limit1[0]); const yMin = Math.min(limit0[1], limit1[1]); @@ -208,4 +188,73 @@ renderPCB({ mmPerUnit: 25.4 }) +function SwitchDiodeMatrixNeopixels_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { + // Circuit generator params + const ncols = 2 + const nrows = 3 + + // Global params + const traceSize = 0.015 + const viaTemplate = via(0.02, 0.035) + + // Return object + const obj = { + footprints: {}, + pts: {} + } + + // Actual generator code + allColWirePoints = [] + for (let yIndex=0; yIndex < nrows; yIndex++) { + colWirePoints = [] + rowDiodeVias = [] + + for (let xIndex=0; xIndex < ncols; xIndex++) { + index = yIndex * ncols + xIndex + 1 + + buttonPos = [xy[0] + colSpacing * xIndex, xy[1] + rowSpacing * yIndex] + obj.footprints[`SW${1 + xIndex * nrows + yIndex}`] = button = board.add( + SW_Hotswap_Kailh_MX, + { + translate: buttonPos, rotate: 0, + id: `SW${1 + xIndex * nrows + yIndex}` + }) + + diodePos = [buttonPos[0] + diodeOffset[0], buttonPos[1] + diodeOffset[1]] + obj[`D${2 + xIndex * nrows + yIndex}`] = diode = board.add( + D_SOD_323, + { + translate: diodePos, rotate: 90, + id: `D${2 + xIndex * nrows + yIndex}` + }) + + // create stub wire for button -> column common line + colWirePoint = [buttonPos[0], button.padY("2")] + board.wire([colWirePoint, button.pad("2")], traceSize, "F.Cu") + colWirePoints.push(colWirePoint) + + // create wire for button -> diode + board.wire([button.pad("1"), diode.pad("1")], traceSize, "F.Cu") + diodeViaPos = [diode.padX("2"), buttonPos[1] + rowSpacing / 2] + diodeVia = board.add(viaTemplate, {translate: diodeViaPos}) + board.wire([diode.pad("2"), diodeVia.pos], traceSize) + + if (rowDiodeVias.length > 0) { + board.wire([rowDiodeVias[rowDiodeVias.length - 1].pos, diodeVia.pos], traceSize, "B.Cu") + } + rowDiodeVias.push(diodeVia) + } + allColWirePoints.push(colWirePoints) + } + + // Inter-row wiring + for (let xIndex=0; xIndex < allColWirePoints[0].length; xIndex++) { + board.wire([ + allColWirePoints[0][xIndex], + allColWirePoints[allColWirePoints.length - 1][xIndex] + ], traceSize, "F.Cu") + } + + return obj +} diff --git a/examples/TestBlinkyMicro/TestBlinkyMicro.net.ref b/examples/TestBlinkyMicro/TestBlinkyMicro.net.ref deleted file mode 100644 index e469e6002..000000000 --- a/examples/TestBlinkyMicro/TestBlinkyMicro.net.ref +++ /dev/null @@ -1,438 +0,0 @@ -(export (version D) -(components -(comp (ref "J1") - (value "usb.conn") - (footprint "Connector_USB:USB_C_Receptacle_XKB_U262-16XN-4BVC11") - (property (name "Sheetname") (value "usb")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCReceptacle")) - (property (name "edg_path") (value "usb.conn")) - (property (name "edg_short_path") (value "usb.conn")) - (property (name "edg_refdes") (value "J1")) - (property (name "edg_part") (value "COM-15111 (Sparkfun)")) - (property (name "edg_value") (value "COM-15111")) - (sheetpath (names "/usb/") (tstamps "/02aa014b/")) - (tstamps "042701af")) -(comp (ref "R1") - (value "usb.cc_pull.cc1") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "cc_pull")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) - (property (name "edg_path") (value "usb.cc_pull.cc1")) - (property (name "edg_short_path") (value "usb.cc_pull.cc1")) - (property (name "edg_refdes") (value "R1")) - (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) - (tstamps "022300f8")) -(comp (ref "R2") - (value "usb.cc_pull.cc2") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "cc_pull")) - (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) - (property (name "edg_path") (value "usb.cc_pull.cc2")) - (property (name "edg_short_path") (value "usb.cc_pull.cc2")) - (property (name "edg_refdes") (value "R2")) - (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) - (tstamps "022400f9")) -(comp (ref "U1") - (value "reg.ic") - (footprint "Package_TO_SOT_SMD:SOT-23-6") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.ic")) - (property (name "edg_short_path") (value "reg.ic")) - (property (name "edg_refdes") (value "U1")) - (property (name "edg_part") (value "TPS561201 (Texas Instruments)")) - (property (name "edg_value") (value "TPS561201")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "013700cd")) -(comp (ref "R3") - (value "reg.fb.top_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.top_res")) - (property (name "edg_short_path") (value "reg.fb.top_res")) - (property (name "edg_refdes") (value "R3")) - (property (name "edg_part") (value "0603WAF3302T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 33kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "0c0c02fd")) -(comp (ref "R4") - (value "reg.fb.bottom_res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "fb")) - (property (name "Sheetfile") (value "edg.circuits.ResistiveDivider.FeedbackVoltageDivider")) - (property (name "edg_path") (value "reg.fb.div.bottom_res")) - (property (name "edg_short_path") (value "reg.fb.bottom_res")) - (property (name "edg_refdes") (value "R4")) - (property (name "edg_part") (value "0603WAF1002T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 10kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/reg/fb/") (tstamps "/028a013f/013000c9/")) - (tstamps "175b043f")) -(comp (ref "C1") - (value "reg.hf_in_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.hf_in_cap.cap")) - (property (name "edg_short_path") (value "reg.hf_in_cap")) - (property (name "edg_refdes") (value "C1")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "11ed0398")) -(comp (ref "C2") - (value "reg.vbst_cap") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "reg")) - (property (name "Sheetfile") (value "edg.parts.power.converter.TexasInstruments_Buck.Tps561201")) - (property (name "edg_path") (value "reg.vbst_cap.cap")) - (property (name "edg_short_path") (value "reg.vbst_cap")) - (property (name "edg_refdes") (value "C2")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/") (tstamps "/028a013f/")) - (tstamps "0f330353")) -(comp (ref "L1") - (value "reg.power_path.inductor") - (footprint "Inductor_SMD:L_0805_2012Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.inductor")) - (property (name "edg_short_path") (value "reg.power_path.inductor")) - (property (name "edg_refdes") (value "L1")) - (property (name "edg_part") (value "MPH201214S100MT (Sunlord)")) - (property (name "edg_value") (value "1A 10uH ±20% 375mΩ SMD,2.0x1.25x1.45mm Inductors (SMD) ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0f2b0369")) -(comp (ref "C3") - (value "reg.power_path.in_cap") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.in_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.in_cap")) - (property (name "edg_refdes") (value "C3")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0879026b")) -(comp (ref "C4") - (value "reg.power_path.out_cap") - (footprint "Capacitor_SMD:C_0805_2012Metric") - (property (name "Sheetname") (value "power_path")) - (property (name "Sheetfile") (value "edg.circuits.BuckConverterPowerPath.BuckConverterPowerPath")) - (property (name "edg_path") (value "reg.power_path.out_cap.cap")) - (property (name "edg_short_path") (value "reg.power_path.out_cap")) - (property (name "edg_refdes") (value "C4")) - (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/reg/power_path/") (tstamps "/028a013f/1786043a/")) - (tstamps "0be902ec")) -(comp (ref "U2") - (value "mcu.ic") - (footprint "RF_Module:ESP32-WROOM-32") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Esp32.Esp32_Wroom_32")) - (property (name "edg_path") (value "mcu.ic")) - (property (name "edg_short_path") (value "mcu.ic")) - (property (name "edg_refdes") (value "U2")) - (property (name "edg_part") (value "ESP32-WROOM-32 (Espressif Systems)")) - (property (name "edg_value") (value "ESP32-WROOM-32")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "013700cd")) -(comp (ref "C5") - (value "mcu.vcc_cap0") - (footprint "Capacitor_SMD:C_1206_3216Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Esp32.Esp32_Wroom_32")) - (property (name "edg_path") (value "mcu.vcc_cap0.cap")) - (property (name "edg_short_path") (value "mcu.vcc_cap0")) - (property (name "edg_refdes") (value "C5")) - (property (name "edg_part") (value "CL31A226KPHNNNE (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "10V 22uF X5R ±10% 1206 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "0e590300")) -(comp (ref "C6") - (value "mcu.vcc_cap1") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Esp32.Esp32_Wroom_32")) - (property (name "edg_path") (value "mcu.vcc_cap1.cap")) - (property (name "edg_short_path") (value "mcu.vcc_cap1")) - (property (name "edg_refdes") (value "C6")) - (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) - (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "0e5a0301")) -(comp (ref "J2") - (value "mcu.prog") - (footprint "Connector_PinHeader_2.54mm:PinHeader_1x04_P2.54mm_Vertical") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Esp32.Esp32_Wroom_32")) - (property (name "edg_path") (value "mcu.prog.conn")) - (property (name "edg_short_path") (value "mcu.prog")) - (property (name "edg_refdes") (value "J2")) - (property (name "edg_part") (value "PinHeader2.54 1x4 (Generic)")) - (property (name "edg_value") (value "PinHeader2.54 1x4")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "045f01b9")) -(comp (ref "SW1") - (value "mcu.boot") - (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") - (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Esp32.Esp32_Wroom_32")) - (property (name "edg_path") (value "mcu.boot.package")) - (property (name "edg_short_path") (value "mcu.boot")) - (property (name "edg_refdes") (value "SW1")) - (property (name "edg_part") (value "5.1mm switch")) - (property (name "edg_value") (value "5.1mm switch")) - (sheetpath (names "/mcu/") (tstamps "/02850146/")) - (tstamps "042b01b5")) -(comp (ref "R5") - (value "mcu.en_pull.r") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "en_pull")) - (property (name "Sheetfile") (value "edg.circuits.PassiveFilters.PullupDelayRc")) - (property (name "edg_path") (value "mcu.en_pull.rc.r")) - (property (name "edg_short_path") (value "mcu.en_pull.r")) - (property (name "edg_refdes") (value "R5")) - (property (name "edg_part") (value "0603WAF1002T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 10kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/mcu/en_pull/") (tstamps "/02850146/0b9c02f0/")) - (tstamps "00730073")) -(comp (ref "C7") - (value "mcu.en_pull.c") - (footprint "Capacitor_SMD:C_0603_1608Metric") - (property (name "Sheetname") (value "en_pull")) - (property (name "Sheetfile") (value "edg.circuits.PassiveFilters.PullupDelayRc")) - (property (name "edg_path") (value "mcu.en_pull.rc.c")) - (property (name "edg_short_path") (value "mcu.en_pull.c")) - (property (name "edg_refdes") (value "C7")) - (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) - (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) - (sheetpath (names "/mcu/en_pull/") (tstamps "/02850146/0b9c02f0/")) - (tstamps "00640064")) -(comp (ref "SW2") - (value "sw") - (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") - (property (name "Sheetname") (value "")) - (property (name "Sheetfile") (value "")) - (property (name "edg_path") (value "sw.package")) - (property (name "edg_short_path") (value "sw")) - (property (name "edg_refdes") (value "SW2")) - (property (name "edg_part") (value "5.1mm switch")) - (property (name "edg_value") (value "5.1mm switch")) - (sheetpath (names "/") (tstamps "/")) - (tstamps "015f00eb")) -(comp (ref "D1") - (value "led[0].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[0]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[0].package")) - (property (name "edg_short_path") (value "led[0].package")) - (property (name "edg_refdes") (value "D1")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[0]/") (tstamps "/07e5021e/")) - (tstamps "0b4e02cd")) -(comp (ref "R6") - (value "led[0].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[0]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[0].res")) - (property (name "edg_short_path") (value "led[0].res")) - (property (name "edg_refdes") (value "R6")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[0]/") (tstamps "/07e5021e/")) - (tstamps "0296014b")) -(comp (ref "D2") - (value "led[1].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[1]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[1].package")) - (property (name "edg_short_path") (value "led[1].package")) - (property (name "edg_refdes") (value "D2")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[1]/") (tstamps "/07e7021f/")) - (tstamps "0b4e02cd")) -(comp (ref "R7") - (value "led[1].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[1]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[1].res")) - (property (name "edg_short_path") (value "led[1].res")) - (property (name "edg_refdes") (value "R7")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[1]/") (tstamps "/07e7021f/")) - (tstamps "0296014b")) -(comp (ref "D3") - (value "led[2].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[2]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[2].package")) - (property (name "edg_short_path") (value "led[2].package")) - (property (name "edg_refdes") (value "D3")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[2]/") (tstamps "/07e90220/")) - (tstamps "0b4e02cd")) -(comp (ref "R8") - (value "led[2].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[2]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[2].res")) - (property (name "edg_short_path") (value "led[2].res")) - (property (name "edg_refdes") (value "R8")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[2]/") (tstamps "/07e90220/")) - (tstamps "0296014b")) -(comp (ref "D4") - (value "led[3].package") - (footprint "LED_SMD:LED_0603_1608Metric") - (property (name "Sheetname") (value "led[3]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[3].package")) - (property (name "edg_short_path") (value "led[3].package")) - (property (name "edg_refdes") (value "D4")) - (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) - (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) - (sheetpath (names "/led[3]/") (tstamps "/07eb0221/")) - (tstamps "0b4e02cd")) -(comp (ref "R9") - (value "led[3].res") - (footprint "Resistor_SMD:R_0603_1608Metric") - (property (name "Sheetname") (value "led[3]")) - (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) - (property (name "edg_path") (value "led[3].res")) - (property (name "edg_short_path") (value "led[3].res")) - (property (name "edg_refdes") (value "R9")) - (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) - (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) - (sheetpath (names "/led[3]/") (tstamps "/07eb0221/")) - (tstamps "0296014b"))) -(nets -(net (code 1) (name "usb.pwr") - (node (ref J1) (pin A4)) - (node (ref J1) (pin A9)) - (node (ref J1) (pin B4)) - (node (ref J1) (pin B9)) - (node (ref U1) (pin 3)) - (node (ref U1) (pin 5)) - (node (ref C1) (pin 1)) - (node (ref C3) (pin 1))) -(net (code 2) (name "usb.gnd") - (node (ref J1) (pin A1)) - (node (ref J1) (pin A12)) - (node (ref J1) (pin B1)) - (node (ref J1) (pin B12)) - (node (ref J1) (pin S1)) - (node (ref R1) (pin 1)) - (node (ref R2) (pin 1)) - (node (ref U1) (pin 1)) - (node (ref R4) (pin 2)) - (node (ref C1) (pin 2)) - (node (ref C3) (pin 2)) - (node (ref C4) (pin 2)) - (node (ref U2) (pin 1)) - (node (ref U2) (pin 15)) - (node (ref U2) (pin 38)) - (node (ref U2) (pin 39)) - (node (ref C5) (pin 2)) - (node (ref C6) (pin 2)) - (node (ref J2) (pin 4)) - (node (ref SW1) (pin 2)) - (node (ref C7) (pin 2)) - (node (ref SW2) (pin 2)) - (node (ref R6) (pin 2)) - (node (ref R7) (pin 2)) - (node (ref R8) (pin 2)) - (node (ref R9) (pin 2))) -(net (code 3) (name "usb.usb.dp") - (node (ref J1) (pin A6)) - (node (ref J1) (pin B6))) -(net (code 4) (name "usb.usb.dm") - (node (ref J1) (pin A7)) - (node (ref J1) (pin B7))) -(net (code 5) (name "usb.conn.cc.cc1") - (node (ref J1) (pin A5)) - (node (ref R1) (pin 2))) -(net (code 6) (name "usb.conn.cc.cc2") - (node (ref J1) (pin B5)) - (node (ref R2) (pin 2))) -(net (code 7) (name "reg.pwr_out") - (node (ref R3) (pin 1)) - (node (ref L1) (pin 2)) - (node (ref C4) (pin 1)) - (node (ref U2) (pin 2)) - (node (ref C5) (pin 1)) - (node (ref C6) (pin 1)) - (node (ref J2) (pin 1)) - (node (ref R5) (pin 1))) -(net (code 8) (name "reg.ic.sw") - (node (ref U1) (pin 2)) - (node (ref C2) (pin 2)) - (node (ref L1) (pin 1))) -(net (code 9) (name "reg.ic.fb") - (node (ref U1) (pin 4)) - (node (ref R3) (pin 2)) - (node (ref R4) (pin 1))) -(net (code 10) (name "reg.ic.vbst") - (node (ref U1) (pin 6)) - (node (ref C2) (pin 1))) -(net (code 11) (name "mcu.program_uart_node.a_tx") - (node (ref U2) (pin 35)) - (node (ref J2) (pin 2))) -(net (code 12) (name "mcu.program_uart_node.b_tx") - (node (ref U2) (pin 34)) - (node (ref J2) (pin 3))) -(net (code 13) (name "mcu.program_en_node") - (node (ref U2) (pin 3)) - (node (ref R5) (pin 2)) - (node (ref C7) (pin 1))) -(net (code 14) (name "mcu.program_boot_node") - (node (ref U2) (pin 25)) - (node (ref SW1) (pin 1))) -(net (code 15) (name "mcu.ic.io2") - (node (ref U2) (pin 24))) -(net (code 16) (name "sw.out") - (node (ref U2) (pin 8)) - (node (ref SW2) (pin 1))) -(net (code 17) (name "led[0].signal") - (node (ref U2) (pin 26)) - (node (ref D1) (pin 2))) -(net (code 18) (name "led[0].package.k") - (node (ref D1) (pin 1)) - (node (ref R6) (pin 1))) -(net (code 19) (name "led[1].signal") - (node (ref U2) (pin 27)) - (node (ref D2) (pin 2))) -(net (code 20) (name "led[1].package.k") - (node (ref D2) (pin 1)) - (node (ref R7) (pin 1))) -(net (code 21) (name "led[2].signal") - (node (ref U2) (pin 28)) - (node (ref D3) (pin 2))) -(net (code 22) (name "led[2].package.k") - (node (ref D3) (pin 1)) - (node (ref R8) (pin 1))) -(net (code 23) (name "led[3].signal") - (node (ref U2) (pin 29)) - (node (ref D4) (pin 2))) -(net (code 24) (name "led[3].package.k") - (node (ref D4) (pin 1)) - (node (ref R9) (pin 1)))) -) \ No newline at end of file diff --git a/examples/TestBlinkyMicro/TestBlinkyMicro.svgpcb.js b/examples/TestBlinkyMicro/TestBlinkyMicro.svgpcb.js deleted file mode 100644 index fff8bc4c9..000000000 --- a/examples/TestBlinkyMicro/TestBlinkyMicro.svgpcb.js +++ /dev/null @@ -1,204 +0,0 @@ -const board = new PCB(); - -// usb.conn -const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { - translate: pt(2.750, 0.165), rotate: 0, - id: 'J1' -}) -// usb.cc_pull.cc1 -const R1 = board.add(R_0603_1608Metric, { - translate: pt(2.598, 0.420), rotate: 0, - id: 'R1' -}) -// usb.cc_pull.cc2 -const R2 = board.add(R_0603_1608Metric, { - translate: pt(2.754, 0.420), rotate: 0, - id: 'R2' -}) -// reg.ic -const U1 = board.add(SOT_23_6, { - translate: pt(0.081, 1.809), rotate: 0, - id: 'U1' -}) -// reg.fb.div.top_res -const R3 = board.add(R_0603_1608Metric, { - translate: pt(0.409, 1.944), rotate: 0, - id: 'R3' -}) -// reg.fb.div.bottom_res -const R4 = board.add(R_0603_1608Metric, { - translate: pt(0.058, 2.061), rotate: 0, - id: 'R4' -}) -// reg.hf_in_cap.cap -const C1 = board.add(C_0603_1608Metric, { - translate: pt(0.214, 2.061), rotate: 0, - id: 'C1' -}) -// reg.vbst_cap.cap -const C2 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 2.061), rotate: 0, - id: 'C2' -}) -// reg.power_path.inductor -const L1 = board.add(L_0805_2012Metric, { - translate: pt(0.242, 1.949), rotate: 0, - id: 'L1' -}) -// reg.power_path.in_cap.cap -const C3 = board.add(C_0805_2012Metric, { - translate: pt(0.268, 1.781), rotate: 0, - id: 'C3' -}) -// reg.power_path.out_cap.cap -const C4 = board.add(C_0805_2012Metric, { - translate: pt(0.067, 1.954), rotate: 0, - id: 'C4' -}) -// mcu.ic -const U2 = board.add(ESP32_WROOM_32, { - translate: pt(0.945, 0.414), rotate: 0, - id: 'U2' -}) -// mcu.vcc_cap0.cap -const C5 = board.add(C_1206_3216Metric, { - translate: pt(2.020, 0.789), rotate: 0, - id: 'C5' -}) -// mcu.vcc_cap1.cap -const C6 = board.add(C_0603_1608Metric, { - translate: pt(2.208, 0.773), rotate: 0, - id: 'C6' -}) -// mcu.prog.conn -const J2 = board.add(PinHeader_1x04_P2_54mm_Vertical, { - translate: pt(2.000, 0.370), rotate: 0, - id: 'J2' -}) -// mcu.boot.package -const SW1 = board.add(SW_SPST_SKQG_WithoutStem, { - translate: pt(2.096, 0.593), rotate: 0, - id: 'SW1' -}) -// mcu.en_pull.rc.r -const R5 = board.add(R_0603_1608Metric, { - translate: pt(2.364, 0.773), rotate: 0, - id: 'R5' -}) -// mcu.en_pull.rc.c -const C7 = board.add(C_0603_1608Metric, { - translate: pt(1.987, 0.903), rotate: 0, - id: 'C7' -}) -// sw.package -const SW2 = board.add(SW_SPST_SKQG_WithoutStem, { - translate: pt(0.752, 1.854), rotate: 0, - id: 'SW2' -}) -// led[0].package -const D1 = board.add(LED_0603_1608Metric, { - translate: pt(1.096, 1.771), rotate: 0, - id: 'D1' -}) -// led[0].res -const R6 = board.add(R_0603_1608Metric, { - translate: pt(1.096, 1.868), rotate: 0, - id: 'R6' -}) -// led[1].package -const D2 = board.add(LED_0603_1608Metric, { - translate: pt(1.331, 1.771), rotate: 0, - id: 'D2' -}) -// led[1].res -const R7 = board.add(R_0603_1608Metric, { - translate: pt(1.331, 1.868), rotate: 0, - id: 'R7' -}) -// led[2].package -const D3 = board.add(LED_0603_1608Metric, { - translate: pt(1.566, 1.771), rotate: 0, - id: 'D3' -}) -// led[2].res -const R8 = board.add(R_0603_1608Metric, { - translate: pt(1.566, 1.868), rotate: 0, - id: 'R8' -}) -// led[3].package -const D4 = board.add(LED_0603_1608Metric, { - translate: pt(1.801, 1.771), rotate: 0, - id: 'D4' -}) -// led[3].res -const R9 = board.add(R_0603_1608Metric, { - translate: pt(1.801, 1.868), rotate: 0, - id: 'R9' -}) - -board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["U1", "5"], ["C1", "1"], ["C3", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["R4", "2"], ["C1", "2"], ["C3", "2"], ["C4", "2"], ["U2", "1"], ["U2", "15"], ["U2", "38"], ["U2", "39"], ["C5", "2"], ["C6", "2"], ["J2", "4"], ["SW1", "2"], ["C7", "2"], ["SW2", "2"], ["R6", "2"], ["R7", "2"], ["R8", "2"], ["R9", "2"]]}, - {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"]]}, - {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"]]}, - {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, - {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, - {name: "reg.pwr_out", pads: [["R3", "1"], ["L1", "2"], ["C4", "1"], ["U2", "2"], ["C5", "1"], ["C6", "1"], ["J2", "1"], ["R5", "1"]]}, - {name: "reg.ic.sw", pads: [["U1", "2"], ["C2", "2"], ["L1", "1"]]}, - {name: "reg.ic.fb", pads: [["U1", "4"], ["R3", "2"], ["R4", "1"]]}, - {name: "reg.ic.vbst", pads: [["U1", "6"], ["C2", "1"]]}, - {name: "mcu.program_uart_node.a_tx", pads: [["U2", "35"], ["J2", "2"]]}, - {name: "mcu.program_uart_node.b_tx", pads: [["U2", "34"], ["J2", "3"]]}, - {name: "mcu.program_en_node", pads: [["U2", "3"], ["R5", "2"], ["C7", "1"]]}, - {name: "mcu.program_boot_node", pads: [["U2", "25"], ["SW1", "1"]]}, - {name: "mcu.ic.io2", pads: [["U2", "24"]]}, - {name: "sw.out", pads: [["U2", "8"], ["SW2", "1"]]}, - {name: "led[0].signal", pads: [["U2", "26"], ["D1", "2"]]}, - {name: "led[0].package.k", pads: [["D1", "1"], ["R6", "1"]]}, - {name: "led[1].signal", pads: [["U2", "27"], ["D2", "2"]]}, - {name: "led[1].package.k", pads: [["D2", "1"], ["R7", "1"]]}, - {name: "led[2].signal", pads: [["U2", "28"], ["D3", "2"]]}, - {name: "led[2].package.k", pads: [["D3", "1"], ["R8", "1"]]}, - {name: "led[3].signal", pads: [["U2", "29"], ["D4", "2"]]}, - {name: "led[3].package.k", pads: [["D4", "1"], ["R9", "1"]]} -]) - -const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(3.077165354330709, 2.20748031496063); -const xMin = Math.min(limit0[0], limit1[0]); -const xMax = Math.max(limit0[0], limit1[0]); -const yMin = Math.min(limit0[1], limit1[1]); -const yMax = Math.max(limit0[1], limit1[1]); - -const filletRadius = 0.1; -const outline = path( - [(xMin+xMax/2), yMax], - ["fillet", filletRadius, [xMax, yMax]], - ["fillet", filletRadius, [xMax, yMin]], - ["fillet", filletRadius, [xMin, yMin]], - ["fillet", filletRadius, [xMin, yMax]], - [(xMin+xMax/2), yMax], -); -board.addShape("outline", outline); - -renderPCB({ - pcb: board, - layerColors: { - "F.Paste": "#000000ff", - "F.Mask": "#000000ff", - "B.Mask": "#000000ff", - "componentLabels": "#00e5e5e5", - "outline": "#002d00ff", - "padLabels": "#ffff99e5", - "B.Cu": "#ef4e4eff", - "F.Cu": "#ff8c00cc", - }, - limits: { - x: [xMin, xMax], - y: [yMin, yMax] - }, - background: "#00000000", - mmPerUnit: 25.4 -}) - - diff --git a/examples/TestBlinkyPinned/TestBlinkyPinned.net.ref b/examples/TestBlinkyPinned/TestBlinkyPinned.net.ref new file mode 100644 index 000000000..0a6d8dadc --- /dev/null +++ b/examples/TestBlinkyPinned/TestBlinkyPinned.net.ref @@ -0,0 +1,743 @@ +(export (version D) +(components +(comp (ref "J1") + (value "usb.conn") + (footprint "Connector_USB:USB_C_Receptacle_XKB_U262-16XN-4BVC11") + (property (name "Sheetname") (value "usb")) + (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCReceptacle")) + (property (name "edg_path") (value "usb.conn")) + (property (name "edg_short_path") (value "usb.conn")) + (property (name "edg_refdes") (value "J1")) + (property (name "edg_part") (value "COM-15111 (Sparkfun)")) + (property (name "edg_value") (value "COM-15111")) + (sheetpath (names "/usb/") (tstamps "/02aa014b/")) + (tstamps "042701af")) +(comp (ref "R1") + (value "usb.cc_pull.cc1") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "cc_pull")) + (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) + (property (name "edg_path") (value "usb.cc_pull.cc1")) + (property (name "edg_short_path") (value "usb.cc_pull.cc1")) + (property (name "edg_refdes") (value "R1")) + (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) + (tstamps "022300f8")) +(comp (ref "R2") + (value "usb.cc_pull.cc2") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "cc_pull")) + (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) + (property (name "edg_path") (value "usb.cc_pull.cc2")) + (property (name "edg_short_path") (value "usb.cc_pull.cc2")) + (property (name "edg_refdes") (value "R2")) + (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) + (tstamps "022400f9")) +(comp (ref "U1") + (value "reg.ic") + (footprint "Package_TO_SOT_SMD:SOT-223-3_TabPin2") + (property (name "Sheetname") (value "reg")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.ic")) + (property (name "edg_short_path") (value "reg.ic")) + (property (name "edg_refdes") (value "U1")) + (property (name "edg_part") (value "AMS1117-3.3 (Advanced Monolithic Systems)")) + (property (name "edg_value") (value "AMS1117-3.3")) + (sheetpath (names "/reg/") (tstamps "/028a013f/")) + (tstamps "013700cd")) +(comp (ref "C1") + (value "reg.in_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "reg")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.in_cap.cap")) + (property (name "edg_short_path") (value "reg.in_cap")) + (property (name "edg_refdes") (value "C1")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/reg/") (tstamps "/028a013f/")) + (tstamps "0879026b")) +(comp (ref "C2") + (value "reg.out_cap") + (footprint "Capacitor_SMD:C_1206_3216Metric") + (property (name "Sheetname") (value "reg")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.out_cap.cap")) + (property (name "edg_short_path") (value "reg.out_cap")) + (property (name "edg_refdes") (value "C2")) + (property (name "edg_part") (value "CL31A226KPHNNNE (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "10V 22uF X5R ±10% 1206 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/reg/") (tstamps "/028a013f/")) + (tstamps "0be902ec")) +(comp (ref "U2") + (value "mcu.ic") + (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.ic")) + (property (name "edg_short_path") (value "mcu.ic")) + (property (name "edg_refdes") (value "U2")) + (property (name "edg_part") (value "STM32F103xxT6 (STMicroelectronics)")) + (property (name "edg_value") (value "STM32F103xxT6")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "013700cd")) +(comp (ref "C3") + (value "mcu.pwr_cap[0]") + (footprint "Capacitor_SMD:C_0805_2012Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) + (property (name "edg_refdes") (value "C3")) + (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168703d5")) +(comp (ref "C4") + (value "mcu.pwr_cap[1]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) + (property (name "edg_refdes") (value "C4")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168903d6")) +(comp (ref "C5") + (value "mcu.pwr_cap[2]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) + (property (name "edg_refdes") (value "C5")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168b03d7")) +(comp (ref "C6") + (value "mcu.pwr_cap[3]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) + (property (name "edg_refdes") (value "C6")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168d03d8")) +(comp (ref "C7") + (value "mcu.vdda_cap_0") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) + (property (name "edg_short_path") (value "mcu.vdda_cap_0")) + (property (name "edg_refdes") (value "C7")) + (property (name "edg_part") (value "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))")) + (property (name "edg_value") (value "50V 10nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "15dc03c2")) +(comp (ref "C8") + (value "mcu.vdda_cap_1") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) + (property (name "edg_short_path") (value "mcu.vdda_cap_1")) + (property (name "edg_refdes") (value "C8")) + (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "15dd03c3")) +(comp (ref "X1") + (value "mcu.crystal.package") + (footprint "Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.package")) + (property (name "edg_short_path") (value "mcu.crystal.package")) + (property (name "edg_refdes") (value "X1")) + (property (name "edg_part") (value "X32258MOB4SI (Yangxing Tech)")) + (property (name "edg_value") (value "8MHz SMD Crystal Resonator 12pF ±10ppm ±30ppm -40℃~+85℃ SMD3225-4P Crystals ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "0b4e02cd")) +(comp (ref "C9") + (value "mcu.crystal.cap_a") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.cap_a")) + (property (name "edg_short_path") (value "mcu.crystal.cap_a")) + (property (name "edg_refdes") (value "C9")) + (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "05e701f5")) +(comp (ref "C10") + (value "mcu.crystal.cap_b") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.cap_b")) + (property (name "edg_short_path") (value "mcu.crystal.cap_b")) + (property (name "edg_refdes") (value "C10")) + (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "05e801f6")) +(comp (ref "J2") + (value "mcu.swd") + (footprint "Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.swd.conn")) + (property (name "edg_short_path") (value "mcu.swd")) + (property (name "edg_refdes") (value "J2")) + (property (name "edg_part") (value "PinHeader1.27 Shrouded 2x5 (Generic)")) + (property (name "edg_value") (value "PinHeader1.27 Shrouded 2x5")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "02ae014f")) +(comp (ref "R3") + (value "mcu.usb_pull") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.usb_pull.dp")) + (property (name "edg_short_path") (value "mcu.usb_pull")) + (property (name "edg_refdes") (value "R3")) + (property (name "edg_part") (value "0603WAF1501T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1.5kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "0f5f0367")) +(comp (ref "D1") + (value "led.package") + (footprint "LED_SMD:LED_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.package")) + (property (name "edg_short_path") (value "led.package")) + (property (name "edg_refdes") (value "D1")) + (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) + (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0b4e02cd")) +(comp (ref "R4") + (value "led.res") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.res")) + (property (name "edg_short_path") (value "led.res")) + (property (name "edg_refdes") (value "R4")) + (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0296014b")) +(comp (ref "SW1") + (value "sw.sw[0,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,0].sw")) + (property (name "edg_short_path") (value "sw.sw[0,0].sw")) + (property (name "edg_refdes") (value "SW1")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "015f00eb")) +(comp (ref "D2") + (value "sw.sw[0,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,0].d")) + (property (name "edg_short_path") (value "sw.sw[0,0].d")) + (property (name "edg_refdes") (value "D2")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "00650065")) +(comp (ref "D3") + (value "sw.sw[0,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,0].npx.device")) + (property (name "edg_refdes") (value "D3")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) + (tstamps "08950271")) +(comp (ref "C11") + (value "sw.sw[0,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,0].npx.cap")) + (property (name "edg_refdes") (value "C11")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW2") + (value "sw.sw[1,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,0].sw")) + (property (name "edg_short_path") (value "sw.sw[1,0].sw")) + (property (name "edg_refdes") (value "SW2")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "015f00eb")) +(comp (ref "D4") + (value "sw.sw[1,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,0].d")) + (property (name "edg_short_path") (value "sw.sw[1,0].d")) + (property (name "edg_refdes") (value "D4")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "00650065")) +(comp (ref "D5") + (value "sw.sw[1,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,0].npx.device")) + (property (name "edg_refdes") (value "D5")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) + (tstamps "08950271")) +(comp (ref "C12") + (value "sw.sw[1,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,0].npx.cap")) + (property (name "edg_refdes") (value "C12")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW3") + (value "sw.sw[0,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,1].sw")) + (property (name "edg_short_path") (value "sw.sw[0,1].sw")) + (property (name "edg_refdes") (value "SW3")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "015f00eb")) +(comp (ref "D6") + (value "sw.sw[0,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,1].d")) + (property (name "edg_short_path") (value "sw.sw[0,1].d")) + (property (name "edg_refdes") (value "D6")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "00650065")) +(comp (ref "D7") + (value "sw.sw[0,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,1].npx.device")) + (property (name "edg_refdes") (value "D7")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) + (tstamps "08950271")) +(comp (ref "C13") + (value "sw.sw[0,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,1].npx.cap")) + (property (name "edg_refdes") (value "C13")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW4") + (value "sw.sw[1,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,1].sw")) + (property (name "edg_short_path") (value "sw.sw[1,1].sw")) + (property (name "edg_refdes") (value "SW4")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "015f00eb")) +(comp (ref "D8") + (value "sw.sw[1,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,1].d")) + (property (name "edg_short_path") (value "sw.sw[1,1].d")) + (property (name "edg_refdes") (value "D8")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "00650065")) +(comp (ref "D9") + (value "sw.sw[1,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,1].npx.device")) + (property (name "edg_refdes") (value "D9")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) + (tstamps "08950271")) +(comp (ref "C14") + (value "sw.sw[1,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,1].npx.cap")) + (property (name "edg_refdes") (value "C14")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW5") + (value "sw.sw[0,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,2].sw")) + (property (name "edg_short_path") (value "sw.sw[0,2].sw")) + (property (name "edg_refdes") (value "SW5")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "015f00eb")) +(comp (ref "D10") + (value "sw.sw[0,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,2].d")) + (property (name "edg_short_path") (value "sw.sw[0,2].d")) + (property (name "edg_refdes") (value "D10")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "00650065")) +(comp (ref "D11") + (value "sw.sw[0,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,2].npx.device")) + (property (name "edg_refdes") (value "D11")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) + (tstamps "08950271")) +(comp (ref "C15") + (value "sw.sw[0,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,2].npx.cap")) + (property (name "edg_refdes") (value "C15")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW6") + (value "sw.sw[1,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,2].sw")) + (property (name "edg_short_path") (value "sw.sw[1,2].sw")) + (property (name "edg_refdes") (value "SW6")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "015f00eb")) +(comp (ref "D12") + (value "sw.sw[1,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,2].d")) + (property (name "edg_short_path") (value "sw.sw[1,2].d")) + (property (name "edg_refdes") (value "D12")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "00650065")) +(comp (ref "D13") + (value "sw.sw[1,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,2].npx.device")) + (property (name "edg_refdes") (value "D13")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) + (tstamps "08950271")) +(comp (ref "C16") + (value "sw.sw[1,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,2].npx.cap")) + (property (name "edg_refdes") (value "C16")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) + (tstamps "025e0135")) +(comp (ref "U3") + (value "npx_shift.ic") + (footprint "Package_TO_SOT_SMD:SOT-23-5") + (property (name "Sheetname") (value "npx_shift")) + (property (name "Sheetfile") (value "edg.parts.logic.Logic_74Ahct.L74Ahct1g125")) + (property (name "edg_path") (value "npx_shift.ic")) + (property (name "edg_short_path") (value "npx_shift.ic")) + (property (name "edg_refdes") (value "U3")) + (property (name "edg_part") (value "74AHCT1G125W5-7 (Diodes Incorporated)")) + (property (name "edg_value") (value "74AHCT1G125W5-7")) + (sheetpath (names "/npx_shift/") (tstamps "/134303d4/")) + (tstamps "013700cd")) +(comp (ref "C17") + (value "npx_shift.vdd_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx_shift")) + (property (name "Sheetfile") (value "edg.parts.logic.Logic_74Ahct.L74Ahct1g125")) + (property (name "edg_path") (value "npx_shift.vdd_cap.cap")) + (property (name "edg_short_path") (value "npx_shift.vdd_cap")) + (property (name "edg_refdes") (value "C17")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/npx_shift/") (tstamps "/134303d4/")) + (tstamps "0b6402d2"))) +(nets +(net (code 1) (name "usb.pwr") + (node (ref J1) (pin A4)) + (node (ref J1) (pin A9)) + (node (ref J1) (pin B4)) + (node (ref J1) (pin B9)) + (node (ref U1) (pin 3)) + (node (ref C1) (pin 1)) + (node (ref D3) (pin 1)) + (node (ref C11) (pin 1)) + (node (ref D5) (pin 1)) + (node (ref C12) (pin 1)) + (node (ref D7) (pin 1)) + (node (ref C13) (pin 1)) + (node (ref D9) (pin 1)) + (node (ref C14) (pin 1)) + (node (ref D11) (pin 1)) + (node (ref C15) (pin 1)) + (node (ref D13) (pin 1)) + (node (ref C16) (pin 1)) + (node (ref U3) (pin 5)) + (node (ref C17) (pin 1))) +(net (code 2) (name "usb.gnd") + (node (ref J1) (pin A1)) + (node (ref J1) (pin A12)) + (node (ref J1) (pin B1)) + (node (ref J1) (pin B12)) + (node (ref J1) (pin S1)) + (node (ref R1) (pin 1)) + (node (ref R2) (pin 1)) + (node (ref U1) (pin 1)) + (node (ref C1) (pin 2)) + (node (ref C2) (pin 2)) + (node (ref U2) (pin 23)) + (node (ref U2) (pin 35)) + (node (ref U2) (pin 44)) + (node (ref U2) (pin 47)) + (node (ref U2) (pin 8)) + (node (ref C3) (pin 2)) + (node (ref C4) (pin 2)) + (node (ref C5) (pin 2)) + (node (ref C6) (pin 2)) + (node (ref C7) (pin 2)) + (node (ref C8) (pin 2)) + (node (ref X1) (pin 2)) + (node (ref X1) (pin 4)) + (node (ref C9) (pin 2)) + (node (ref C10) (pin 2)) + (node (ref J2) (pin 3)) + (node (ref J2) (pin 5)) + (node (ref J2) (pin 9)) + (node (ref R4) (pin 2)) + (node (ref D3) (pin 3)) + (node (ref C11) (pin 2)) + (node (ref D5) (pin 3)) + (node (ref C12) (pin 2)) + (node (ref D7) (pin 3)) + (node (ref C13) (pin 2)) + (node (ref D9) (pin 3)) + (node (ref C14) (pin 2)) + (node (ref D11) (pin 3)) + (node (ref C15) (pin 2)) + (node (ref D13) (pin 3)) + (node (ref C16) (pin 2)) + (node (ref U3) (pin 1)) + (node (ref U3) (pin 3)) + (node (ref C17) (pin 2))) +(net (code 3) (name "usb.usb.dp") + (node (ref J1) (pin A6)) + (node (ref J1) (pin B6)) + (node (ref U2) (pin 33)) + (node (ref R3) (pin 2))) +(net (code 4) (name "usb.usb.dm") + (node (ref J1) (pin A7)) + (node (ref J1) (pin B7)) + (node (ref U2) (pin 32))) +(net (code 5) (name "usb.conn.cc.cc1") + (node (ref J1) (pin A5)) + (node (ref R1) (pin 2))) +(net (code 6) (name "usb.conn.cc.cc2") + (node (ref J1) (pin B5)) + (node (ref R2) (pin 2))) +(net (code 7) (name "reg.pwr_out") + (node (ref U1) (pin 2)) + (node (ref C2) (pin 1)) + (node (ref U2) (pin 1)) + (node (ref U2) (pin 24)) + (node (ref U2) (pin 36)) + (node (ref U2) (pin 48)) + (node (ref U2) (pin 9)) + (node (ref C3) (pin 1)) + (node (ref C4) (pin 1)) + (node (ref C5) (pin 1)) + (node (ref C6) (pin 1)) + (node (ref C7) (pin 1)) + (node (ref C8) (pin 1)) + (node (ref J2) (pin 1)) + (node (ref R3) (pin 1))) +(net (code 8) (name "mcu.gpio.cols_0") + (node (ref U2) (pin 16)) + (node (ref SW1) (pin 1)) + (node (ref SW3) (pin 1)) + (node (ref SW5) (pin 1))) +(net (code 9) (name "mcu.gpio.cols_1") + (node (ref U2) (pin 17)) + (node (ref SW2) (pin 1)) + (node (ref SW4) (pin 1)) + (node (ref SW6) (pin 1))) +(net (code 10) (name "mcu.gpio.rows_0") + (node (ref U2) (pin 18)) + (node (ref D2) (pin 1)) + (node (ref D4) (pin 1))) +(net (code 11) (name "mcu.gpio.rows_1") + (node (ref U2) (pin 19)) + (node (ref D6) (pin 1)) + (node (ref D8) (pin 1))) +(net (code 12) (name "mcu.gpio.rows_2") + (node (ref U2) (pin 20)) + (node (ref D10) (pin 1)) + (node (ref D12) (pin 1))) +(net (code 13) (name "mcu.xtal_node.xi") + (node (ref U2) (pin 5)) + (node (ref X1) (pin 1)) + (node (ref C9) (pin 1))) +(net (code 14) (name "mcu.xtal_node.xo") + (node (ref U2) (pin 6)) + (node (ref X1) (pin 3)) + (node (ref C10) (pin 1))) +(net (code 15) (name "mcu.swd_node.swdio") + (node (ref U2) (pin 34)) + (node (ref J2) (pin 2))) +(net (code 16) (name "mcu.swd_node.swclk") + (node (ref U2) (pin 37)) + (node (ref J2) (pin 4))) +(net (code 17) (name "mcu.reset_node") + (node (ref U2) (pin 7)) + (node (ref J2) (pin 10))) +(net (code 18) (name "mcu.swd.tdi") + (node (ref J2) (pin 8))) +(net (code 19) (name "mcu.swd.swo") + (node (ref J2) (pin 6))) +(net (code 20) (name "led.signal") + (node (ref U2) (pin 10)) + (node (ref D1) (pin 2))) +(net (code 21) (name "led.package.k") + (node (ref D1) (pin 1)) + (node (ref R4) (pin 1))) +(net (code 22) (name "sw.npx_din") + (node (ref D3) (pin 4)) + (node (ref U3) (pin 4))) +(net (code 23) (name "sw.npx_dout") + (node (ref D13) (pin 2))) +(net (code 24) (name "sw.sw[0,0].npx_dout") + (node (ref D3) (pin 2)) + (node (ref D5) (pin 4))) +(net (code 25) (name "sw.sw[0,0].sw.com") + (node (ref SW1) (pin 2)) + (node (ref D2) (pin 2))) +(net (code 26) (name "sw.sw[1,0].npx_dout") + (node (ref D5) (pin 2)) + (node (ref D9) (pin 4))) +(net (code 27) (name "sw.sw[1,0].sw.com") + (node (ref SW2) (pin 2)) + (node (ref D4) (pin 2))) +(net (code 28) (name "sw.sw[0,1].npx_din") + (node (ref D7) (pin 4)) + (node (ref D9) (pin 2))) +(net (code 29) (name "sw.sw[0,1].npx_dout") + (node (ref D7) (pin 2)) + (node (ref D11) (pin 4))) +(net (code 30) (name "sw.sw[0,1].sw.com") + (node (ref SW3) (pin 2)) + (node (ref D6) (pin 2))) +(net (code 31) (name "sw.sw[1,1].sw.com") + (node (ref SW4) (pin 2)) + (node (ref D8) (pin 2))) +(net (code 32) (name "sw.sw[0,2].npx_dout") + (node (ref D11) (pin 2)) + (node (ref D13) (pin 4))) +(net (code 33) (name "sw.sw[0,2].sw.com") + (node (ref SW5) (pin 2)) + (node (ref D10) (pin 2))) +(net (code 34) (name "sw.sw[1,2].sw.com") + (node (ref SW6) (pin 2)) + (node (ref D12) (pin 2))) +(net (code 35) (name "npx_shift.input") + (node (ref U2) (pin 11)) + (node (ref U3) (pin 2)))) +) \ No newline at end of file diff --git a/examples/TestBlinkyPinned/TestBlinkyPinned.svgpcb.js b/examples/TestBlinkyPinned/TestBlinkyPinned.svgpcb.js new file mode 100644 index 000000000..e1d52f4ad --- /dev/null +++ b/examples/TestBlinkyPinned/TestBlinkyPinned.svgpcb.js @@ -0,0 +1,260 @@ +const board = new PCB(); + +const sw = SwitchDiodeMatrixNeopixels_2_3_sw(pt(0.039, 0.039)) +// usb.conn +const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { + translate: pt(2.252, 0.165), rotate: 0, + id: 'J1' +}) +// usb.cc_pull.cc1 +const R1 = board.add(R_0603_1608Metric, { + translate: pt(2.101, 0.420), rotate: 0, + id: 'R1' +}) +// usb.cc_pull.cc2 +const R2 = board.add(R_0603_1608Metric, { + translate: pt(2.257, 0.420), rotate: 0, + id: 'R2' +}) +// reg.ic +const U1 = board.add(SOT_223_3_TabPin2, { + translate: pt(1.291, 0.935), rotate: 0, + id: 'U1' +}) +// reg.in_cap.cap +const C1 = board.add(C_0603_1608Metric, { + translate: pt(1.397, 1.145), rotate: 0, + id: 'C1' +}) +// reg.out_cap.cap +const C2 = board.add(C_1206_3216Metric, { + translate: pt(1.209, 1.162), rotate: 0, + id: 'C2' +}) +// mcu.ic +const U2 = board.add(LQFP_48_7x7mm_P0_5mm, { + translate: pt(1.321, 0.203), rotate: 0, + id: 'U2' +}) +// mcu.pwr_cap[0].cap +const C3 = board.add(C_0805_2012Metric, { + translate: pt(1.390, 0.483), rotate: 0, + id: 'C3' +}) +// mcu.pwr_cap[1].cap +const C4 = board.add(C_0603_1608Metric, { + translate: pt(1.554, 0.474), rotate: 0, + id: 'C4' +}) +// mcu.pwr_cap[2].cap +const C5 = board.add(C_0603_1608Metric, { + translate: pt(1.710, 0.474), rotate: 0, + id: 'C5' +}) +// mcu.pwr_cap[3].cap +const C6 = board.add(C_0603_1608Metric, { + translate: pt(1.866, 0.474), rotate: 0, + id: 'C6' +}) +// mcu.vdda_cap_0.cap +const C7 = board.add(C_0603_1608Metric, { + translate: pt(1.176, 0.647), rotate: 0, + id: 'C7' +}) +// mcu.vdda_cap_1.cap +const C8 = board.add(C_0603_1608Metric, { + translate: pt(1.332, 0.647), rotate: 0, + id: 'C8' +}) +// mcu.crystal.package +const X1 = board.add(Crystal_SMD_3225_4Pin_3_2x2_5mm, { + translate: pt(1.201, 0.512), rotate: 0, + id: 'X1' +}) +// mcu.crystal.cap_a +const C9 = board.add(C_0603_1608Metric, { + translate: pt(1.488, 0.647), rotate: 0, + id: 'C9' +}) +// mcu.crystal.cap_b +const C10 = board.add(C_0603_1608Metric, { + translate: pt(1.644, 0.647), rotate: 0, + id: 'C10' +}) +// mcu.swd.conn +const J2 = board.add(PinHeader_2x05_P1_27mm_Vertical_SMD, { + translate: pt(1.732, 0.146), rotate: 0, + id: 'J2' +}) +// mcu.usb_pull.dp +const R3 = board.add(R_0603_1608Metric, { + translate: pt(1.800, 0.647), rotate: 0, + id: 'R3' +}) +// led.package +const D1 = board.add(LED_0603_1608Metric, { + translate: pt(1.921, 0.823), rotate: 0, + id: 'D1' +}) +// led.res +const R4 = board.add(R_0603_1608Metric, { + translate: pt(1.920, 0.920), rotate: 0, + id: 'R4' +}) +// npx_shift.ic +const U3 = board.add(SOT_23_5, { + translate: pt(1.663, 0.861), rotate: 0, + id: 'U3' +}) +// npx_shift.vdd_cap.cap +const C17 = board.add(C_0603_1608Metric, { + translate: pt(1.641, 0.996), rotate: 0, + id: 'C17' +}) + +board.setNetlist([ + {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "1"], ["C11", "1"], ["D5", "1"], ["C12", "1"], ["D7", "1"], ["C13", "1"], ["D9", "1"], ["C14", "1"], ["D11", "1"], ["C15", "1"], ["D13", "1"], ["C16", "1"], ["U3", "5"], ["C17", "1"]]}, + {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"], ["D3", "3"], ["C11", "2"], ["D5", "3"], ["C12", "2"], ["D7", "3"], ["C13", "2"], ["D9", "3"], ["C14", "2"], ["D11", "3"], ["C15", "2"], ["D13", "3"], ["C16", "2"], ["U3", "1"], ["U3", "3"], ["C17", "2"]]}, + {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "33"], ["R3", "2"]]}, + {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "32"]]}, + {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, + {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, + {name: "reg.pwr_out", pads: [["U1", "2"], ["C2", "1"], ["U2", "1"], ["U2", "24"], ["U2", "36"], ["U2", "48"], ["U2", "9"], ["C3", "1"], ["C4", "1"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["C8", "1"], ["J2", "1"], ["R3", "1"]]}, + {name: "mcu.gpio.cols_0", pads: [["U2", "16"], ["SW1", "1"], ["SW3", "1"], ["SW5", "1"]]}, + {name: "mcu.gpio.cols_1", pads: [["U2", "17"], ["SW2", "1"], ["SW4", "1"], ["SW6", "1"]]}, + {name: "mcu.gpio.rows_0", pads: [["U2", "18"], ["D2", "1"], ["D4", "1"]]}, + {name: "mcu.gpio.rows_1", pads: [["U2", "19"], ["D6", "1"], ["D8", "1"]]}, + {name: "mcu.gpio.rows_2", pads: [["U2", "20"], ["D10", "1"], ["D12", "1"]]}, + {name: "mcu.xtal_node.xi", pads: [["U2", "5"], ["X1", "1"], ["C9", "1"]]}, + {name: "mcu.xtal_node.xo", pads: [["U2", "6"], ["X1", "3"], ["C10", "1"]]}, + {name: "mcu.swd_node.swdio", pads: [["U2", "34"], ["J2", "2"]]}, + {name: "mcu.swd_node.swclk", pads: [["U2", "37"], ["J2", "4"]]}, + {name: "mcu.reset_node", pads: [["U2", "7"], ["J2", "10"]]}, + {name: "mcu.swd.tdi", pads: [["J2", "8"]]}, + {name: "mcu.swd.swo", pads: [["J2", "6"]]}, + {name: "led.signal", pads: [["U2", "10"], ["D1", "2"]]}, + {name: "led.package.k", pads: [["D1", "1"], ["R4", "1"]]}, + {name: "sw.npx_din", pads: [["D3", "4"], ["U3", "4"]]}, + {name: "sw.npx_dout", pads: [["D13", "2"]]}, + {name: "sw.sw[0,0].npx_dout", pads: [["D3", "2"], ["D5", "4"]]}, + {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, + {name: "sw.sw[1,0].npx_dout", pads: [["D5", "2"], ["D9", "4"]]}, + {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D4", "2"]]}, + {name: "sw.sw[0,1].npx_din", pads: [["D7", "4"], ["D9", "2"]]}, + {name: "sw.sw[0,1].npx_dout", pads: [["D7", "2"], ["D11", "4"]]}, + {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D6", "2"]]}, + {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D8", "2"]]}, + {name: "sw.sw[0,2].npx_dout", pads: [["D11", "2"], ["D13", "4"]]}, + {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D10", "2"]]}, + {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D12", "2"]]}, + {name: "npx_shift.input", pads: [["U2", "11"], ["U3", "2"]]} +]) + +const limit0 = pt(-0.07874015748031496, -0.07874015748031496); +const limit1 = pt(2.5795275590551188, 2.1181102362204722); +const xMin = Math.min(limit0[0], limit1[0]); +const xMax = Math.max(limit0[0], limit1[0]); +const yMin = Math.min(limit0[1], limit1[1]); +const yMax = Math.max(limit0[1], limit1[1]); + +const filletRadius = 0.1; +const outline = path( + [(xMin+xMax/2), yMax], + ["fillet", filletRadius, [xMax, yMax]], + ["fillet", filletRadius, [xMax, yMin]], + ["fillet", filletRadius, [xMin, yMin]], + ["fillet", filletRadius, [xMin, yMax]], + [(xMin+xMax/2), yMax], +); +board.addShape("outline", outline); + +renderPCB({ + pcb: board, + layerColors: { + "F.Paste": "#000000ff", + "F.Mask": "#000000ff", + "B.Mask": "#000000ff", + "componentLabels": "#00e5e5e5", + "outline": "#002d00ff", + "padLabels": "#ffff99e5", + "B.Cu": "#ef4e4eff", + "F.Cu": "#ff8c00cc", + }, + limits: { + x: [xMin, xMax], + y: [yMin, yMax] + }, + background: "#00000000", + mmPerUnit: 25.4 +}) + +function SwitchDiodeMatrixNeopixels_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { + // Circuit generator params + const ncols = 2 + const nrows = 3 + + // Global params + const traceSize = 0.015 + const viaTemplate = via(0.02, 0.035) + + // Return object + const obj = { + footprints: {}, + pts: {} + } + + // Actual generator code + allColWirePoints = [] + for (let yIndex=0; yIndex < nrows; yIndex++) { + colWirePoints = [] + rowDiodeVias = [] + + for (let xIndex=0; xIndex < ncols; xIndex++) { + index = yIndex * ncols + xIndex + 1 + + buttonPos = [xy[0] + colSpacing * xIndex, xy[1] + rowSpacing * yIndex] + obj.footprints[`SW${1 + xIndex * nrows + yIndex}`] = button = board.add( + SW_Hotswap_Kailh_MX, + { + translate: buttonPos, rotate: 0, + id: `SW${1 + xIndex * nrows + yIndex}` + }) + + diodePos = [buttonPos[0] + diodeOffset[0], buttonPos[1] + diodeOffset[1]] + obj[`D${2 + xIndex * nrows + yIndex}`] = diode = board.add( + D_SOD_323, + { + translate: diodePos, rotate: 90, + id: `D${2 + xIndex * nrows + yIndex}` + }) + + // create stub wire for button -> column common line + colWirePoint = [buttonPos[0], button.padY("2")] + board.wire([colWirePoint, button.pad("2")], traceSize, "F.Cu") + colWirePoints.push(colWirePoint) + + // create wire for button -> diode + board.wire([button.pad("1"), diode.pad("1")], traceSize, "F.Cu") + diodeViaPos = [diode.padX("2"), buttonPos[1] + rowSpacing / 2] + diodeVia = board.add(viaTemplate, {translate: diodeViaPos}) + board.wire([diode.pad("2"), diodeVia.pos], traceSize) + + if (rowDiodeVias.length > 0) { + board.wire([rowDiodeVias[rowDiodeVias.length - 1].pos, diodeVia.pos], traceSize, "B.Cu") + } + rowDiodeVias.push(diodeVia) + } + allColWirePoints.push(colWirePoints) + } + + // Inter-row wiring + for (let xIndex=0; xIndex < allColWirePoints[0].length; xIndex++) { + board.wire([ + allColWirePoints[0][xIndex], + allColWirePoints[allColWirePoints.length - 1][xIndex] + ], traceSize, "F.Cu") + } + + return obj +} + diff --git a/examples/TestBlinkyRegulated/TestBlinkyRegulated.net.ref b/examples/TestBlinkyRegulated/TestBlinkyRegulated.net.ref new file mode 100644 index 000000000..e3517f4ba --- /dev/null +++ b/examples/TestBlinkyRegulated/TestBlinkyRegulated.net.ref @@ -0,0 +1,523 @@ +(export (version D) +(components +(comp (ref "J1") + (value "usb.conn") + (footprint "Connector_USB:USB_C_Receptacle_XKB_U262-16XN-4BVC11") + (property (name "Sheetname") (value "usb")) + (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCReceptacle")) + (property (name "edg_path") (value "usb.conn")) + (property (name "edg_short_path") (value "usb.conn")) + (property (name "edg_refdes") (value "J1")) + (property (name "edg_part") (value "COM-15111 (Sparkfun)")) + (property (name "edg_value") (value "COM-15111")) + (sheetpath (names "/usb/") (tstamps "/02aa014b/")) + (tstamps "042701af")) +(comp (ref "R1") + (value "usb.cc_pull.cc1") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "cc_pull")) + (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) + (property (name "edg_path") (value "usb.cc_pull.cc1")) + (property (name "edg_short_path") (value "usb.cc_pull.cc1")) + (property (name "edg_refdes") (value "R1")) + (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) + (tstamps "022300f8")) +(comp (ref "R2") + (value "usb.cc_pull.cc2") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "cc_pull")) + (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) + (property (name "edg_path") (value "usb.cc_pull.cc2")) + (property (name "edg_short_path") (value "usb.cc_pull.cc2")) + (property (name "edg_refdes") (value "R2")) + (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) + (tstamps "022400f9")) +(comp (ref "U1") + (value "reg.ic") + (footprint "Package_TO_SOT_SMD:SOT-223-3_TabPin2") + (property (name "Sheetname") (value "reg")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.ic")) + (property (name "edg_short_path") (value "reg.ic")) + (property (name "edg_refdes") (value "U1")) + (property (name "edg_part") (value "AMS1117-3.3 (Advanced Monolithic Systems)")) + (property (name "edg_value") (value "AMS1117-3.3")) + (sheetpath (names "/reg/") (tstamps "/028a013f/")) + (tstamps "013700cd")) +(comp (ref "C1") + (value "reg.in_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "reg")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.in_cap.cap")) + (property (name "edg_short_path") (value "reg.in_cap")) + (property (name "edg_refdes") (value "C1")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/reg/") (tstamps "/028a013f/")) + (tstamps "0879026b")) +(comp (ref "C2") + (value "reg.out_cap") + (footprint "Capacitor_SMD:C_1206_3216Metric") + (property (name "Sheetname") (value "reg")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.out_cap.cap")) + (property (name "edg_short_path") (value "reg.out_cap")) + (property (name "edg_refdes") (value "C2")) + (property (name "edg_part") (value "CL31A226KPHNNNE (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "10V 22uF X5R ±10% 1206 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/reg/") (tstamps "/028a013f/")) + (tstamps "0be902ec")) +(comp (ref "U2") + (value "mcu.ic") + (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.ic")) + (property (name "edg_short_path") (value "mcu.ic")) + (property (name "edg_refdes") (value "U2")) + (property (name "edg_part") (value "STM32F103xxT6 (STMicroelectronics)")) + (property (name "edg_value") (value "STM32F103xxT6")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "013700cd")) +(comp (ref "C3") + (value "mcu.pwr_cap[0]") + (footprint "Capacitor_SMD:C_0805_2012Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) + (property (name "edg_refdes") (value "C3")) + (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168703d5")) +(comp (ref "C4") + (value "mcu.pwr_cap[1]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) + (property (name "edg_refdes") (value "C4")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168903d6")) +(comp (ref "C5") + (value "mcu.pwr_cap[2]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) + (property (name "edg_refdes") (value "C5")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168b03d7")) +(comp (ref "C6") + (value "mcu.pwr_cap[3]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) + (property (name "edg_refdes") (value "C6")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168d03d8")) +(comp (ref "C7") + (value "mcu.vdda_cap_0") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) + (property (name "edg_short_path") (value "mcu.vdda_cap_0")) + (property (name "edg_refdes") (value "C7")) + (property (name "edg_part") (value "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))")) + (property (name "edg_value") (value "50V 10nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "15dc03c2")) +(comp (ref "C8") + (value "mcu.vdda_cap_1") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) + (property (name "edg_short_path") (value "mcu.vdda_cap_1")) + (property (name "edg_refdes") (value "C8")) + (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "15dd03c3")) +(comp (ref "X1") + (value "mcu.crystal.package") + (footprint "Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.package")) + (property (name "edg_short_path") (value "mcu.crystal.package")) + (property (name "edg_refdes") (value "X1")) + (property (name "edg_part") (value "X32258MOB4SI (Yangxing Tech)")) + (property (name "edg_value") (value "8MHz SMD Crystal Resonator 12pF ±10ppm ±30ppm -40℃~+85℃ SMD3225-4P Crystals ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "0b4e02cd")) +(comp (ref "C9") + (value "mcu.crystal.cap_a") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.cap_a")) + (property (name "edg_short_path") (value "mcu.crystal.cap_a")) + (property (name "edg_refdes") (value "C9")) + (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "05e701f5")) +(comp (ref "C10") + (value "mcu.crystal.cap_b") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.cap_b")) + (property (name "edg_short_path") (value "mcu.crystal.cap_b")) + (property (name "edg_refdes") (value "C10")) + (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "05e801f6")) +(comp (ref "J2") + (value "mcu.swd") + (footprint "Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.swd.conn")) + (property (name "edg_short_path") (value "mcu.swd")) + (property (name "edg_refdes") (value "J2")) + (property (name "edg_part") (value "PinHeader1.27 Shrouded 2x5 (Generic)")) + (property (name "edg_value") (value "PinHeader1.27 Shrouded 2x5")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "02ae014f")) +(comp (ref "R3") + (value "mcu.usb_pull") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.usb_pull.dp")) + (property (name "edg_short_path") (value "mcu.usb_pull")) + (property (name "edg_refdes") (value "R3")) + (property (name "edg_part") (value "0603WAF1501T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1.5kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "0f5f0367")) +(comp (ref "D1") + (value "led.package") + (footprint "LED_SMD:LED_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.package")) + (property (name "edg_short_path") (value "led.package")) + (property (name "edg_refdes") (value "D1")) + (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) + (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0b4e02cd")) +(comp (ref "R4") + (value "led.res") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.res")) + (property (name "edg_short_path") (value "led.res")) + (property (name "edg_refdes") (value "R4")) + (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0296014b")) +(comp (ref "SW1") + (value "sw.sw[0,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,0].sw")) + (property (name "edg_short_path") (value "sw.sw[0,0].sw")) + (property (name "edg_refdes") (value "SW1")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "015f00eb")) +(comp (ref "D2") + (value "sw.sw[0,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,0].d")) + (property (name "edg_short_path") (value "sw.sw[0,0].d")) + (property (name "edg_refdes") (value "D2")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "00650065")) +(comp (ref "SW2") + (value "sw.sw[1,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,0].sw")) + (property (name "edg_short_path") (value "sw.sw[1,0].sw")) + (property (name "edg_refdes") (value "SW2")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "015f00eb")) +(comp (ref "D3") + (value "sw.sw[1,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,0].d")) + (property (name "edg_short_path") (value "sw.sw[1,0].d")) + (property (name "edg_refdes") (value "D3")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "00650065")) +(comp (ref "SW3") + (value "sw.sw[0,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,1].sw")) + (property (name "edg_short_path") (value "sw.sw[0,1].sw")) + (property (name "edg_refdes") (value "SW3")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "015f00eb")) +(comp (ref "D4") + (value "sw.sw[0,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,1].d")) + (property (name "edg_short_path") (value "sw.sw[0,1].d")) + (property (name "edg_refdes") (value "D4")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "00650065")) +(comp (ref "SW4") + (value "sw.sw[1,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,1].sw")) + (property (name "edg_short_path") (value "sw.sw[1,1].sw")) + (property (name "edg_refdes") (value "SW4")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "015f00eb")) +(comp (ref "D5") + (value "sw.sw[1,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,1].d")) + (property (name "edg_short_path") (value "sw.sw[1,1].d")) + (property (name "edg_refdes") (value "D5")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "00650065")) +(comp (ref "SW5") + (value "sw.sw[0,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,2].sw")) + (property (name "edg_short_path") (value "sw.sw[0,2].sw")) + (property (name "edg_refdes") (value "SW5")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "015f00eb")) +(comp (ref "D6") + (value "sw.sw[0,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,2].d")) + (property (name "edg_short_path") (value "sw.sw[0,2].d")) + (property (name "edg_refdes") (value "D6")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "00650065")) +(comp (ref "SW6") + (value "sw.sw[1,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,2].sw")) + (property (name "edg_short_path") (value "sw.sw[1,2].sw")) + (property (name "edg_refdes") (value "SW6")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "015f00eb")) +(comp (ref "D7") + (value "sw.sw[1,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,2].d")) + (property (name "edg_short_path") (value "sw.sw[1,2].d")) + (property (name "edg_refdes") (value "D7")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "00650065"))) +(nets +(net (code 1) (name "usb.pwr") + (node (ref J1) (pin A4)) + (node (ref J1) (pin A9)) + (node (ref J1) (pin B4)) + (node (ref J1) (pin B9)) + (node (ref U1) (pin 3)) + (node (ref C1) (pin 1))) +(net (code 2) (name "usb.gnd") + (node (ref J1) (pin A1)) + (node (ref J1) (pin A12)) + (node (ref J1) (pin B1)) + (node (ref J1) (pin B12)) + (node (ref J1) (pin S1)) + (node (ref R1) (pin 1)) + (node (ref R2) (pin 1)) + (node (ref U1) (pin 1)) + (node (ref C1) (pin 2)) + (node (ref C2) (pin 2)) + (node (ref U2) (pin 23)) + (node (ref U2) (pin 35)) + (node (ref U2) (pin 44)) + (node (ref U2) (pin 47)) + (node (ref U2) (pin 8)) + (node (ref C3) (pin 2)) + (node (ref C4) (pin 2)) + (node (ref C5) (pin 2)) + (node (ref C6) (pin 2)) + (node (ref C7) (pin 2)) + (node (ref C8) (pin 2)) + (node (ref X1) (pin 2)) + (node (ref X1) (pin 4)) + (node (ref C9) (pin 2)) + (node (ref C10) (pin 2)) + (node (ref J2) (pin 3)) + (node (ref J2) (pin 5)) + (node (ref J2) (pin 9)) + (node (ref R4) (pin 2))) +(net (code 3) (name "usb.usb.dp") + (node (ref J1) (pin A6)) + (node (ref J1) (pin B6)) + (node (ref U2) (pin 33)) + (node (ref R3) (pin 2))) +(net (code 4) (name "usb.usb.dm") + (node (ref J1) (pin A7)) + (node (ref J1) (pin B7)) + (node (ref U2) (pin 32))) +(net (code 5) (name "usb.conn.cc.cc1") + (node (ref J1) (pin A5)) + (node (ref R1) (pin 2))) +(net (code 6) (name "usb.conn.cc.cc2") + (node (ref J1) (pin B5)) + (node (ref R2) (pin 2))) +(net (code 7) (name "reg.pwr_out") + (node (ref U1) (pin 2)) + (node (ref C2) (pin 1)) + (node (ref U2) (pin 1)) + (node (ref U2) (pin 24)) + (node (ref U2) (pin 36)) + (node (ref U2) (pin 48)) + (node (ref U2) (pin 9)) + (node (ref C3) (pin 1)) + (node (ref C4) (pin 1)) + (node (ref C5) (pin 1)) + (node (ref C6) (pin 1)) + (node (ref C7) (pin 1)) + (node (ref C8) (pin 1)) + (node (ref J2) (pin 1)) + (node (ref R3) (pin 1))) +(net (code 8) (name "mcu.gpio.cols_0") + (node (ref U2) (pin 11)) + (node (ref SW1) (pin 1)) + (node (ref SW3) (pin 1)) + (node (ref SW5) (pin 1))) +(net (code 9) (name "mcu.gpio.cols_1") + (node (ref U2) (pin 12)) + (node (ref SW2) (pin 1)) + (node (ref SW4) (pin 1)) + (node (ref SW6) (pin 1))) +(net (code 10) (name "mcu.gpio.rows_0") + (node (ref U2) (pin 13)) + (node (ref D2) (pin 1)) + (node (ref D3) (pin 1))) +(net (code 11) (name "mcu.gpio.rows_1") + (node (ref U2) (pin 14)) + (node (ref D4) (pin 1)) + (node (ref D5) (pin 1))) +(net (code 12) (name "mcu.gpio.rows_2") + (node (ref U2) (pin 15)) + (node (ref D6) (pin 1)) + (node (ref D7) (pin 1))) +(net (code 13) (name "mcu.xtal_node.xi") + (node (ref U2) (pin 5)) + (node (ref X1) (pin 1)) + (node (ref C9) (pin 1))) +(net (code 14) (name "mcu.xtal_node.xo") + (node (ref U2) (pin 6)) + (node (ref X1) (pin 3)) + (node (ref C10) (pin 1))) +(net (code 15) (name "mcu.swd_node.swdio") + (node (ref U2) (pin 34)) + (node (ref J2) (pin 2))) +(net (code 16) (name "mcu.swd_node.swclk") + (node (ref U2) (pin 37)) + (node (ref J2) (pin 4))) +(net (code 17) (name "mcu.reset_node") + (node (ref U2) (pin 7)) + (node (ref J2) (pin 10))) +(net (code 18) (name "mcu.swd.tdi") + (node (ref J2) (pin 8))) +(net (code 19) (name "mcu.swd.swo") + (node (ref J2) (pin 6))) +(net (code 20) (name "led.signal") + (node (ref U2) (pin 10)) + (node (ref D1) (pin 2))) +(net (code 21) (name "led.package.k") + (node (ref D1) (pin 1)) + (node (ref R4) (pin 1))) +(net (code 22) (name "sw.sw[0,0].sw.com") + (node (ref SW1) (pin 2)) + (node (ref D2) (pin 2))) +(net (code 23) (name "sw.sw[1,0].sw.com") + (node (ref SW2) (pin 2)) + (node (ref D3) (pin 2))) +(net (code 24) (name "sw.sw[0,1].sw.com") + (node (ref SW3) (pin 2)) + (node (ref D4) (pin 2))) +(net (code 25) (name "sw.sw[1,1].sw.com") + (node (ref SW4) (pin 2)) + (node (ref D5) (pin 2))) +(net (code 26) (name "sw.sw[0,2].sw.com") + (node (ref SW5) (pin 2)) + (node (ref D6) (pin 2))) +(net (code 27) (name "sw.sw[1,2].sw.com") + (node (ref SW6) (pin 2)) + (node (ref D7) (pin 2)))) +) \ No newline at end of file diff --git a/examples/TestBlinkyRegulated/TestBlinkyRegulated.svgpcb.js b/examples/TestBlinkyRegulated/TestBlinkyRegulated.svgpcb.js new file mode 100644 index 000000000..fa527b5db --- /dev/null +++ b/examples/TestBlinkyRegulated/TestBlinkyRegulated.svgpcb.js @@ -0,0 +1,242 @@ +const board = new PCB(); + +const sw = SwitchDiodeMatrix_2_3_sw(pt(0.039, 0.039)) +// usb.conn +const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { + translate: pt(1.328, 0.958), rotate: 0, + id: 'J1' +}) +// usb.cc_pull.cc1 +const R1 = board.add(R_0603_1608Metric, { + translate: pt(1.176, 1.213), rotate: 0, + id: 'R1' +}) +// usb.cc_pull.cc2 +const R2 = board.add(R_0603_1608Metric, { + translate: pt(1.332, 1.213), rotate: 0, + id: 'R2' +}) +// reg.ic +const U1 = board.add(SOT_223_3_TabPin2, { + translate: pt(1.828, 0.935), rotate: 0, + id: 'U1' +}) +// reg.in_cap.cap +const C1 = board.add(C_0603_1608Metric, { + translate: pt(1.934, 1.145), rotate: 0, + id: 'C1' +}) +// reg.out_cap.cap +const C2 = board.add(C_1206_3216Metric, { + translate: pt(1.746, 1.162), rotate: 0, + id: 'C2' +}) +// mcu.ic +const U2 = board.add(LQFP_48_7x7mm_P0_5mm, { + translate: pt(1.321, 0.203), rotate: 0, + id: 'U2' +}) +// mcu.pwr_cap[0].cap +const C3 = board.add(C_0805_2012Metric, { + translate: pt(1.390, 0.483), rotate: 0, + id: 'C3' +}) +// mcu.pwr_cap[1].cap +const C4 = board.add(C_0603_1608Metric, { + translate: pt(1.554, 0.474), rotate: 0, + id: 'C4' +}) +// mcu.pwr_cap[2].cap +const C5 = board.add(C_0603_1608Metric, { + translate: pt(1.710, 0.474), rotate: 0, + id: 'C5' +}) +// mcu.pwr_cap[3].cap +const C6 = board.add(C_0603_1608Metric, { + translate: pt(1.866, 0.474), rotate: 0, + id: 'C6' +}) +// mcu.vdda_cap_0.cap +const C7 = board.add(C_0603_1608Metric, { + translate: pt(1.176, 0.647), rotate: 0, + id: 'C7' +}) +// mcu.vdda_cap_1.cap +const C8 = board.add(C_0603_1608Metric, { + translate: pt(1.332, 0.647), rotate: 0, + id: 'C8' +}) +// mcu.crystal.package +const X1 = board.add(Crystal_SMD_3225_4Pin_3_2x2_5mm, { + translate: pt(1.201, 0.512), rotate: 0, + id: 'X1' +}) +// mcu.crystal.cap_a +const C9 = board.add(C_0603_1608Metric, { + translate: pt(1.488, 0.647), rotate: 0, + id: 'C9' +}) +// mcu.crystal.cap_b +const C10 = board.add(C_0603_1608Metric, { + translate: pt(1.644, 0.647), rotate: 0, + id: 'C10' +}) +// mcu.swd.conn +const J2 = board.add(PinHeader_2x05_P1_27mm_Vertical_SMD, { + translate: pt(1.732, 0.146), rotate: 0, + id: 'J2' +}) +// mcu.usb_pull.dp +const R3 = board.add(R_0603_1608Metric, { + translate: pt(1.800, 0.647), rotate: 0, + id: 'R3' +}) +// led.package +const D1 = board.add(LED_0603_1608Metric, { + translate: pt(2.178, 0.823), rotate: 0, + id: 'D1' +}) +// led.res +const R4 = board.add(R_0603_1608Metric, { + translate: pt(2.178, 0.920), rotate: 0, + id: 'R4' +}) + +board.setNetlist([ + {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"]]}, + {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"]]}, + {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "33"], ["R3", "2"]]}, + {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "32"]]}, + {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, + {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, + {name: "reg.pwr_out", pads: [["U1", "2"], ["C2", "1"], ["U2", "1"], ["U2", "24"], ["U2", "36"], ["U2", "48"], ["U2", "9"], ["C3", "1"], ["C4", "1"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["C8", "1"], ["J2", "1"], ["R3", "1"]]}, + {name: "mcu.gpio.cols_0", pads: [["U2", "11"], ["SW1", "1"], ["SW3", "1"], ["SW5", "1"]]}, + {name: "mcu.gpio.cols_1", pads: [["U2", "12"], ["SW2", "1"], ["SW4", "1"], ["SW6", "1"]]}, + {name: "mcu.gpio.rows_0", pads: [["U2", "13"], ["D2", "1"], ["D3", "1"]]}, + {name: "mcu.gpio.rows_1", pads: [["U2", "14"], ["D4", "1"], ["D5", "1"]]}, + {name: "mcu.gpio.rows_2", pads: [["U2", "15"], ["D6", "1"], ["D7", "1"]]}, + {name: "mcu.xtal_node.xi", pads: [["U2", "5"], ["X1", "1"], ["C9", "1"]]}, + {name: "mcu.xtal_node.xo", pads: [["U2", "6"], ["X1", "3"], ["C10", "1"]]}, + {name: "mcu.swd_node.swdio", pads: [["U2", "34"], ["J2", "2"]]}, + {name: "mcu.swd_node.swclk", pads: [["U2", "37"], ["J2", "4"]]}, + {name: "mcu.reset_node", pads: [["U2", "7"], ["J2", "10"]]}, + {name: "mcu.swd.tdi", pads: [["J2", "8"]]}, + {name: "mcu.swd.swo", pads: [["J2", "6"]]}, + {name: "led.signal", pads: [["U2", "10"], ["D1", "2"]]}, + {name: "led.package.k", pads: [["D1", "1"], ["R4", "1"]]}, + {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, + {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D3", "2"]]}, + {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D4", "2"]]}, + {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D5", "2"]]}, + {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D6", "2"]]}, + {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D7", "2"]]} +]) + +const limit0 = pt(-0.07874015748031496, -0.07874015748031496); +const limit1 = pt(2.3545275590551187, 2.1181102362204722); +const xMin = Math.min(limit0[0], limit1[0]); +const xMax = Math.max(limit0[0], limit1[0]); +const yMin = Math.min(limit0[1], limit1[1]); +const yMax = Math.max(limit0[1], limit1[1]); + +const filletRadius = 0.1; +const outline = path( + [(xMin+xMax/2), yMax], + ["fillet", filletRadius, [xMax, yMax]], + ["fillet", filletRadius, [xMax, yMin]], + ["fillet", filletRadius, [xMin, yMin]], + ["fillet", filletRadius, [xMin, yMax]], + [(xMin+xMax/2), yMax], +); +board.addShape("outline", outline); + +renderPCB({ + pcb: board, + layerColors: { + "F.Paste": "#000000ff", + "F.Mask": "#000000ff", + "B.Mask": "#000000ff", + "componentLabels": "#00e5e5e5", + "outline": "#002d00ff", + "padLabels": "#ffff99e5", + "B.Cu": "#ef4e4eff", + "F.Cu": "#ff8c00cc", + }, + limits: { + x: [xMin, xMax], + y: [yMin, yMax] + }, + background: "#00000000", + mmPerUnit: 25.4 +}) + +function SwitchDiodeMatrix_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { + // Circuit generator params + const ncols = 2 + const nrows = 3 + + // Global params + const traceSize = 0.015 + const viaTemplate = via(0.02, 0.035) + + // Return object + const obj = { + footprints: {}, + pts: {} + } + + // Actual generator code + allColWirePoints = [] + for (let yIndex=0; yIndex < nrows; yIndex++) { + colWirePoints = [] + rowDiodeVias = [] + + for (let xIndex=0; xIndex < ncols; xIndex++) { + index = yIndex * ncols + xIndex + 1 + + buttonPos = [xy[0] + colSpacing * xIndex, xy[1] + rowSpacing * yIndex] + obj.footprints[`SW${1 + xIndex * nrows + yIndex}`] = button = board.add( + SW_Hotswap_Kailh_MX, + { + translate: buttonPos, rotate: 0, + id: `SW${1 + xIndex * nrows + yIndex}` + }) + + diodePos = [buttonPos[0] + diodeOffset[0], buttonPos[1] + diodeOffset[1]] + obj[`D${2 + xIndex * nrows + yIndex}`] = diode = board.add( + D_SOD_323, + { + translate: diodePos, rotate: 90, + id: `D${2 + xIndex * nrows + yIndex}` + }) + + // create stub wire for button -> column common line + colWirePoint = [buttonPos[0], button.padY("2")] + board.wire([colWirePoint, button.pad("2")], traceSize, "F.Cu") + colWirePoints.push(colWirePoint) + + // create wire for button -> diode + board.wire([button.pad("1"), diode.pad("1")], traceSize, "F.Cu") + diodeViaPos = [diode.padX("2"), buttonPos[1] + rowSpacing / 2] + diodeVia = board.add(viaTemplate, {translate: diodeViaPos}) + board.wire([diode.pad("2"), diodeVia.pos], traceSize) + + if (rowDiodeVias.length > 0) { + board.wire([rowDiodeVias[rowDiodeVias.length - 1].pos, diodeVia.pos], traceSize, "B.Cu") + } + rowDiodeVias.push(diodeVia) + } + allColWirePoints.push(colWirePoints) + } + + // Inter-row wiring + for (let xIndex=0; xIndex < allColWirePoints[0].length; xIndex++) { + board.wire([ + allColWirePoints[0][xIndex], + allColWirePoints[allColWirePoints.length - 1][xIndex] + ], traceSize, "F.Cu") + } + + return obj +} + diff --git a/examples/TestBlinkyRgb/TestBlinkyRgb.net.ref b/examples/TestBlinkyRgb/TestBlinkyRgb.net.ref new file mode 100644 index 000000000..09562dc7a --- /dev/null +++ b/examples/TestBlinkyRgb/TestBlinkyRgb.net.ref @@ -0,0 +1,743 @@ +(export (version D) +(components +(comp (ref "J1") + (value "usb.conn") + (footprint "Connector_USB:USB_C_Receptacle_XKB_U262-16XN-4BVC11") + (property (name "Sheetname") (value "usb")) + (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCReceptacle")) + (property (name "edg_path") (value "usb.conn")) + (property (name "edg_short_path") (value "usb.conn")) + (property (name "edg_refdes") (value "J1")) + (property (name "edg_part") (value "COM-15111 (Sparkfun)")) + (property (name "edg_value") (value "COM-15111")) + (sheetpath (names "/usb/") (tstamps "/02aa014b/")) + (tstamps "042701af")) +(comp (ref "R1") + (value "usb.cc_pull.cc1") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "cc_pull")) + (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) + (property (name "edg_path") (value "usb.cc_pull.cc1")) + (property (name "edg_short_path") (value "usb.cc_pull.cc1")) + (property (name "edg_refdes") (value "R1")) + (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) + (tstamps "022300f8")) +(comp (ref "R2") + (value "usb.cc_pull.cc2") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "cc_pull")) + (property (name "Sheetfile") (value "edg.parts.connector.UsbPorts.UsbCcPulldownResistor")) + (property (name "edg_path") (value "usb.cc_pull.cc2")) + (property (name "edg_short_path") (value "usb.cc_pull.cc2")) + (property (name "edg_refdes") (value "R2")) + (property (name "edg_part") (value "0603WAF5101T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 5.1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/usb/cc_pull/") (tstamps "/02aa014b/0b4c02e3/")) + (tstamps "022400f9")) +(comp (ref "U1") + (value "reg.ic") + (footprint "Package_TO_SOT_SMD:SOT-223-3_TabPin2") + (property (name "Sheetname") (value "reg")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.ic")) + (property (name "edg_short_path") (value "reg.ic")) + (property (name "edg_refdes") (value "U1")) + (property (name "edg_part") (value "AMS1117-3.3 (Advanced Monolithic Systems)")) + (property (name "edg_value") (value "AMS1117-3.3")) + (sheetpath (names "/reg/") (tstamps "/028a013f/")) + (tstamps "013700cd")) +(comp (ref "C1") + (value "reg.in_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "reg")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.in_cap.cap")) + (property (name "edg_short_path") (value "reg.in_cap")) + (property (name "edg_refdes") (value "C1")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/reg/") (tstamps "/028a013f/")) + (tstamps "0879026b")) +(comp (ref "C2") + (value "reg.out_cap") + (footprint "Capacitor_SMD:C_1206_3216Metric") + (property (name "Sheetname") (value "reg")) + (property (name "Sheetfile") (value "edg.parts.power.converter.LinearRegulators.Ams1117")) + (property (name "edg_path") (value "reg.out_cap.cap")) + (property (name "edg_short_path") (value "reg.out_cap")) + (property (name "edg_refdes") (value "C2")) + (property (name "edg_part") (value "CL31A226KPHNNNE (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "10V 22uF X5R ±10% 1206 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/reg/") (tstamps "/028a013f/")) + (tstamps "0be902ec")) +(comp (ref "U2") + (value "mcu.ic") + (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.ic")) + (property (name "edg_short_path") (value "mcu.ic")) + (property (name "edg_refdes") (value "U2")) + (property (name "edg_part") (value "STM32F103xxT6 (STMicroelectronics)")) + (property (name "edg_value") (value "STM32F103xxT6")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "013700cd")) +(comp (ref "C3") + (value "mcu.pwr_cap[0]") + (footprint "Capacitor_SMD:C_0805_2012Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) + (property (name "edg_refdes") (value "C3")) + (property (name "edg_part") (value "CL21A475KAQNNNE (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "25V 4.7uF X5R ±10% 0805 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168703d5")) +(comp (ref "C4") + (value "mcu.pwr_cap[1]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) + (property (name "edg_refdes") (value "C4")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168903d6")) +(comp (ref "C5") + (value "mcu.pwr_cap[2]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) + (property (name "edg_refdes") (value "C5")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168b03d7")) +(comp (ref "C6") + (value "mcu.pwr_cap[3]") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) + (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) + (property (name "edg_refdes") (value "C6")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "168d03d8")) +(comp (ref "C7") + (value "mcu.vdda_cap_0") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) + (property (name "edg_short_path") (value "mcu.vdda_cap_0")) + (property (name "edg_refdes") (value "C7")) + (property (name "edg_part") (value "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))")) + (property (name "edg_value") (value "50V 10nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "15dc03c2")) +(comp (ref "C8") + (value "mcu.vdda_cap_1") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) + (property (name "edg_short_path") (value "mcu.vdda_cap_1")) + (property (name "edg_refdes") (value "C8")) + (property (name "edg_part") (value "CL10A105KB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 1uF X5R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "15dd03c3")) +(comp (ref "X1") + (value "mcu.crystal.package") + (footprint "Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.package")) + (property (name "edg_short_path") (value "mcu.crystal.package")) + (property (name "edg_refdes") (value "X1")) + (property (name "edg_part") (value "X32258MOB4SI (Yangxing Tech)")) + (property (name "edg_value") (value "8MHz SMD Crystal Resonator 12pF ±10ppm ±30ppm -40℃~+85℃ SMD3225-4P Crystals ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "0b4e02cd")) +(comp (ref "C9") + (value "mcu.crystal.cap_a") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.cap_a")) + (property (name "edg_short_path") (value "mcu.crystal.cap_a")) + (property (name "edg_refdes") (value "C9")) + (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "05e701f5")) +(comp (ref "C10") + (value "mcu.crystal.cap_b") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "crystal")) + (property (name "Sheetfile") (value "edg.abstract_parts.Crystal.OscillatorCrystal")) + (property (name "edg_path") (value "mcu.crystal.cap_b")) + (property (name "edg_short_path") (value "mcu.crystal.cap_b")) + (property (name "edg_refdes") (value "C10")) + (property (name "edg_part") (value "CL10C100JB8NNNC (Samsung Electro-Mechanics)")) + (property (name "edg_value") (value "50V 10pF C0G ±5% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/mcu/crystal/") (tstamps "/02850146/0c1b0303/")) + (tstamps "05e801f6")) +(comp (ref "J2") + (value "mcu.swd") + (footprint "Connector_PinHeader_1.27mm:PinHeader_2x05_P1.27mm_Vertical_SMD") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.swd.conn")) + (property (name "edg_short_path") (value "mcu.swd")) + (property (name "edg_refdes") (value "J2")) + (property (name "edg_part") (value "PinHeader1.27 Shrouded 2x5 (Generic)")) + (property (name "edg_value") (value "PinHeader1.27 Shrouded 2x5")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "02ae014f")) +(comp (ref "R3") + (value "mcu.usb_pull") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "mcu")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) + (property (name "edg_path") (value "mcu.usb_pull.dp")) + (property (name "edg_short_path") (value "mcu.usb_pull")) + (property (name "edg_refdes") (value "R3")) + (property (name "edg_part") (value "0603WAF1501T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1.5kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/mcu/") (tstamps "/02850146/")) + (tstamps "0f5f0367")) +(comp (ref "D1") + (value "led.package") + (footprint "LED_SMD:LED_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.package")) + (property (name "edg_short_path") (value "led.package")) + (property (name "edg_refdes") (value "D1")) + (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) + (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0b4e02cd")) +(comp (ref "R4") + (value "led.res") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.res")) + (property (name "edg_short_path") (value "led.res")) + (property (name "edg_refdes") (value "R4")) + (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0296014b")) +(comp (ref "SW1") + (value "sw.sw[0,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,0].sw")) + (property (name "edg_short_path") (value "sw.sw[0,0].sw")) + (property (name "edg_refdes") (value "SW1")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "015f00eb")) +(comp (ref "D2") + (value "sw.sw[0,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,0].d")) + (property (name "edg_short_path") (value "sw.sw[0,0].d")) + (property (name "edg_refdes") (value "D2")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "00650065")) +(comp (ref "D3") + (value "sw.sw[0,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,0].npx.device")) + (property (name "edg_refdes") (value "D3")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) + (tstamps "08950271")) +(comp (ref "C11") + (value "sw.sw[0,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,0].npx.cap")) + (property (name "edg_refdes") (value "C11")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW2") + (value "sw.sw[1,0].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,0].sw")) + (property (name "edg_short_path") (value "sw.sw[1,0].sw")) + (property (name "edg_refdes") (value "SW2")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "015f00eb")) +(comp (ref "D4") + (value "sw.sw[1,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,0].d")) + (property (name "edg_short_path") (value "sw.sw[1,0].d")) + (property (name "edg_refdes") (value "D4")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "00650065")) +(comp (ref "D5") + (value "sw.sw[1,0].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,0].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,0].npx.device")) + (property (name "edg_refdes") (value "D5")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) + (tstamps "08950271")) +(comp (ref "C12") + (value "sw.sw[1,0].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,0].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,0].npx.cap")) + (property (name "edg_refdes") (value "C12")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW3") + (value "sw.sw[0,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,1].sw")) + (property (name "edg_short_path") (value "sw.sw[0,1].sw")) + (property (name "edg_refdes") (value "SW3")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "015f00eb")) +(comp (ref "D6") + (value "sw.sw[0,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,1].d")) + (property (name "edg_short_path") (value "sw.sw[0,1].d")) + (property (name "edg_refdes") (value "D6")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "00650065")) +(comp (ref "D7") + (value "sw.sw[0,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,1].npx.device")) + (property (name "edg_refdes") (value "D7")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) + (tstamps "08950271")) +(comp (ref "C13") + (value "sw.sw[0,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,1].npx.cap")) + (property (name "edg_refdes") (value "C13")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW4") + (value "sw.sw[1,1].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,1].sw")) + (property (name "edg_short_path") (value "sw.sw[1,1].sw")) + (property (name "edg_refdes") (value "SW4")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "015f00eb")) +(comp (ref "D8") + (value "sw.sw[1,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,1].d")) + (property (name "edg_short_path") (value "sw.sw[1,1].d")) + (property (name "edg_refdes") (value "D8")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "00650065")) +(comp (ref "D9") + (value "sw.sw[1,1].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,1].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,1].npx.device")) + (property (name "edg_refdes") (value "D9")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) + (tstamps "08950271")) +(comp (ref "C14") + (value "sw.sw[1,1].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,1].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,1].npx.cap")) + (property (name "edg_refdes") (value "C14")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW5") + (value "sw.sw[0,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,2].sw")) + (property (name "edg_short_path") (value "sw.sw[0,2].sw")) + (property (name "edg_refdes") (value "SW5")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "015f00eb")) +(comp (ref "D10") + (value "sw.sw[0,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[0,2].d")) + (property (name "edg_short_path") (value "sw.sw[0,2].d")) + (property (name "edg_refdes") (value "D10")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "00650065")) +(comp (ref "D11") + (value "sw.sw[0,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[0,2].npx.device")) + (property (name "edg_refdes") (value "D11")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) + (tstamps "08950271")) +(comp (ref "C15") + (value "sw.sw[0,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[0,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[0,2].npx.cap")) + (property (name "edg_refdes") (value "C15")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) + (tstamps "025e0135")) +(comp (ref "SW6") + (value "sw.sw[1,2].sw") + (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,2].sw")) + (property (name "edg_short_path") (value "sw.sw[1,2].sw")) + (property (name "edg_refdes") (value "SW6")) + (property (name "edg_part") (value "PG151101S11 (Kailh)")) + (property (name "edg_value") (value "PG151101S11")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "015f00eb")) +(comp (ref "D12") + (value "sw.sw[1,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) + (property (name "edg_path") (value "sw.sw[1,2].d")) + (property (name "edg_short_path") (value "sw.sw[1,2].d")) + (property (name "edg_refdes") (value "D12")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "00650065")) +(comp (ref "D13") + (value "sw.sw[1,2].npx.device") + (footprint "edg:LED_SK6812MINI-E") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,2].npx.device")) + (property (name "edg_short_path") (value "sw.sw[1,2].npx.device")) + (property (name "edg_refdes") (value "D13")) + (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) + (property (name "edg_value") (value "SK6812MINI-E")) + (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) + (tstamps "08950271")) +(comp (ref "C16") + (value "sw.sw[1,2].npx.cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "edg_path") (value "sw.sw[1,2].npx.cap.cap")) + (property (name "edg_short_path") (value "sw.sw[1,2].npx.cap")) + (property (name "edg_refdes") (value "C16")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) + (tstamps "025e0135")) +(comp (ref "U3") + (value "npx_shift.ic") + (footprint "Package_TO_SOT_SMD:SOT-23-5") + (property (name "Sheetname") (value "npx_shift")) + (property (name "Sheetfile") (value "edg.parts.logic.Logic_74Ahct.L74Ahct1g125")) + (property (name "edg_path") (value "npx_shift.ic")) + (property (name "edg_short_path") (value "npx_shift.ic")) + (property (name "edg_refdes") (value "U3")) + (property (name "edg_part") (value "74AHCT1G125W5-7 (Diodes Incorporated)")) + (property (name "edg_value") (value "74AHCT1G125W5-7")) + (sheetpath (names "/npx_shift/") (tstamps "/134303d4/")) + (tstamps "013700cd")) +(comp (ref "C17") + (value "npx_shift.vdd_cap") + (footprint "Capacitor_SMD:C_0603_1608Metric") + (property (name "Sheetname") (value "npx_shift")) + (property (name "Sheetfile") (value "edg.parts.logic.Logic_74Ahct.L74Ahct1g125")) + (property (name "edg_path") (value "npx_shift.vdd_cap.cap")) + (property (name "edg_short_path") (value "npx_shift.vdd_cap")) + (property (name "edg_refdes") (value "C17")) + (property (name "edg_part") (value "CC0603KRX7R9BB104 (YAGEO)")) + (property (name "edg_value") (value "50V 100nF X7R ±10% 0603 Multilayer Ceramic Capacitors MLCC - SMD/SMT ROHS")) + (sheetpath (names "/npx_shift/") (tstamps "/134303d4/")) + (tstamps "0b6402d2"))) +(nets +(net (code 1) (name "usb.pwr") + (node (ref J1) (pin A4)) + (node (ref J1) (pin A9)) + (node (ref J1) (pin B4)) + (node (ref J1) (pin B9)) + (node (ref U1) (pin 3)) + (node (ref C1) (pin 1)) + (node (ref D3) (pin 1)) + (node (ref C11) (pin 1)) + (node (ref D5) (pin 1)) + (node (ref C12) (pin 1)) + (node (ref D7) (pin 1)) + (node (ref C13) (pin 1)) + (node (ref D9) (pin 1)) + (node (ref C14) (pin 1)) + (node (ref D11) (pin 1)) + (node (ref C15) (pin 1)) + (node (ref D13) (pin 1)) + (node (ref C16) (pin 1)) + (node (ref U3) (pin 5)) + (node (ref C17) (pin 1))) +(net (code 2) (name "usb.gnd") + (node (ref J1) (pin A1)) + (node (ref J1) (pin A12)) + (node (ref J1) (pin B1)) + (node (ref J1) (pin B12)) + (node (ref J1) (pin S1)) + (node (ref R1) (pin 1)) + (node (ref R2) (pin 1)) + (node (ref U1) (pin 1)) + (node (ref C1) (pin 2)) + (node (ref C2) (pin 2)) + (node (ref U2) (pin 23)) + (node (ref U2) (pin 35)) + (node (ref U2) (pin 44)) + (node (ref U2) (pin 47)) + (node (ref U2) (pin 8)) + (node (ref C3) (pin 2)) + (node (ref C4) (pin 2)) + (node (ref C5) (pin 2)) + (node (ref C6) (pin 2)) + (node (ref C7) (pin 2)) + (node (ref C8) (pin 2)) + (node (ref X1) (pin 2)) + (node (ref X1) (pin 4)) + (node (ref C9) (pin 2)) + (node (ref C10) (pin 2)) + (node (ref J2) (pin 3)) + (node (ref J2) (pin 5)) + (node (ref J2) (pin 9)) + (node (ref R4) (pin 2)) + (node (ref D3) (pin 3)) + (node (ref C11) (pin 2)) + (node (ref D5) (pin 3)) + (node (ref C12) (pin 2)) + (node (ref D7) (pin 3)) + (node (ref C13) (pin 2)) + (node (ref D9) (pin 3)) + (node (ref C14) (pin 2)) + (node (ref D11) (pin 3)) + (node (ref C15) (pin 2)) + (node (ref D13) (pin 3)) + (node (ref C16) (pin 2)) + (node (ref U3) (pin 1)) + (node (ref U3) (pin 3)) + (node (ref C17) (pin 2))) +(net (code 3) (name "usb.usb.dp") + (node (ref J1) (pin A6)) + (node (ref J1) (pin B6)) + (node (ref U2) (pin 33)) + (node (ref R3) (pin 2))) +(net (code 4) (name "usb.usb.dm") + (node (ref J1) (pin A7)) + (node (ref J1) (pin B7)) + (node (ref U2) (pin 32))) +(net (code 5) (name "usb.conn.cc.cc1") + (node (ref J1) (pin A5)) + (node (ref R1) (pin 2))) +(net (code 6) (name "usb.conn.cc.cc2") + (node (ref J1) (pin B5)) + (node (ref R2) (pin 2))) +(net (code 7) (name "reg.pwr_out") + (node (ref U1) (pin 2)) + (node (ref C2) (pin 1)) + (node (ref U2) (pin 1)) + (node (ref U2) (pin 24)) + (node (ref U2) (pin 36)) + (node (ref U2) (pin 48)) + (node (ref U2) (pin 9)) + (node (ref C3) (pin 1)) + (node (ref C4) (pin 1)) + (node (ref C5) (pin 1)) + (node (ref C6) (pin 1)) + (node (ref C7) (pin 1)) + (node (ref C8) (pin 1)) + (node (ref J2) (pin 1)) + (node (ref R3) (pin 1))) +(net (code 8) (name "mcu.gpio.cols_0") + (node (ref U2) (pin 12)) + (node (ref SW1) (pin 1)) + (node (ref SW3) (pin 1)) + (node (ref SW5) (pin 1))) +(net (code 9) (name "mcu.gpio.cols_1") + (node (ref U2) (pin 13)) + (node (ref SW2) (pin 1)) + (node (ref SW4) (pin 1)) + (node (ref SW6) (pin 1))) +(net (code 10) (name "mcu.gpio.rows_0") + (node (ref U2) (pin 14)) + (node (ref D2) (pin 1)) + (node (ref D4) (pin 1))) +(net (code 11) (name "mcu.gpio.rows_1") + (node (ref U2) (pin 15)) + (node (ref D6) (pin 1)) + (node (ref D8) (pin 1))) +(net (code 12) (name "mcu.gpio.rows_2") + (node (ref U2) (pin 16)) + (node (ref D10) (pin 1)) + (node (ref D12) (pin 1))) +(net (code 13) (name "mcu.xtal_node.xi") + (node (ref U2) (pin 5)) + (node (ref X1) (pin 1)) + (node (ref C9) (pin 1))) +(net (code 14) (name "mcu.xtal_node.xo") + (node (ref U2) (pin 6)) + (node (ref X1) (pin 3)) + (node (ref C10) (pin 1))) +(net (code 15) (name "mcu.swd_node.swdio") + (node (ref U2) (pin 34)) + (node (ref J2) (pin 2))) +(net (code 16) (name "mcu.swd_node.swclk") + (node (ref U2) (pin 37)) + (node (ref J2) (pin 4))) +(net (code 17) (name "mcu.reset_node") + (node (ref U2) (pin 7)) + (node (ref J2) (pin 10))) +(net (code 18) (name "mcu.swd.tdi") + (node (ref J2) (pin 8))) +(net (code 19) (name "mcu.swd.swo") + (node (ref J2) (pin 6))) +(net (code 20) (name "led.signal") + (node (ref U2) (pin 10)) + (node (ref D1) (pin 2))) +(net (code 21) (name "led.package.k") + (node (ref D1) (pin 1)) + (node (ref R4) (pin 1))) +(net (code 22) (name "sw.npx_din") + (node (ref D3) (pin 4)) + (node (ref U3) (pin 4))) +(net (code 23) (name "sw.npx_dout") + (node (ref D13) (pin 2))) +(net (code 24) (name "sw.sw[0,0].npx_dout") + (node (ref D3) (pin 2)) + (node (ref D5) (pin 4))) +(net (code 25) (name "sw.sw[0,0].sw.com") + (node (ref SW1) (pin 2)) + (node (ref D2) (pin 2))) +(net (code 26) (name "sw.sw[1,0].npx_dout") + (node (ref D5) (pin 2)) + (node (ref D9) (pin 4))) +(net (code 27) (name "sw.sw[1,0].sw.com") + (node (ref SW2) (pin 2)) + (node (ref D4) (pin 2))) +(net (code 28) (name "sw.sw[0,1].npx_din") + (node (ref D7) (pin 4)) + (node (ref D9) (pin 2))) +(net (code 29) (name "sw.sw[0,1].npx_dout") + (node (ref D7) (pin 2)) + (node (ref D11) (pin 4))) +(net (code 30) (name "sw.sw[0,1].sw.com") + (node (ref SW3) (pin 2)) + (node (ref D6) (pin 2))) +(net (code 31) (name "sw.sw[1,1].sw.com") + (node (ref SW4) (pin 2)) + (node (ref D8) (pin 2))) +(net (code 32) (name "sw.sw[0,2].npx_dout") + (node (ref D11) (pin 2)) + (node (ref D13) (pin 4))) +(net (code 33) (name "sw.sw[0,2].sw.com") + (node (ref SW5) (pin 2)) + (node (ref D10) (pin 2))) +(net (code 34) (name "sw.sw[1,2].sw.com") + (node (ref SW6) (pin 2)) + (node (ref D12) (pin 2))) +(net (code 35) (name "npx_shift.input") + (node (ref U2) (pin 11)) + (node (ref U3) (pin 2)))) +) \ No newline at end of file diff --git a/examples/TestBlinkyRgb/TestBlinkyRgb.svgpcb.js b/examples/TestBlinkyRgb/TestBlinkyRgb.svgpcb.js new file mode 100644 index 000000000..cf479b36c --- /dev/null +++ b/examples/TestBlinkyRgb/TestBlinkyRgb.svgpcb.js @@ -0,0 +1,260 @@ +const board = new PCB(); + +const sw = SwitchDiodeMatrixNeopixels_2_3_sw(pt(0.039, 0.039)) +// usb.conn +const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { + translate: pt(2.252, 0.165), rotate: 0, + id: 'J1' +}) +// usb.cc_pull.cc1 +const R1 = board.add(R_0603_1608Metric, { + translate: pt(2.101, 0.420), rotate: 0, + id: 'R1' +}) +// usb.cc_pull.cc2 +const R2 = board.add(R_0603_1608Metric, { + translate: pt(2.257, 0.420), rotate: 0, + id: 'R2' +}) +// reg.ic +const U1 = board.add(SOT_223_3_TabPin2, { + translate: pt(1.291, 0.935), rotate: 0, + id: 'U1' +}) +// reg.in_cap.cap +const C1 = board.add(C_0603_1608Metric, { + translate: pt(1.397, 1.145), rotate: 0, + id: 'C1' +}) +// reg.out_cap.cap +const C2 = board.add(C_1206_3216Metric, { + translate: pt(1.209, 1.162), rotate: 0, + id: 'C2' +}) +// mcu.ic +const U2 = board.add(LQFP_48_7x7mm_P0_5mm, { + translate: pt(1.321, 0.203), rotate: 0, + id: 'U2' +}) +// mcu.pwr_cap[0].cap +const C3 = board.add(C_0805_2012Metric, { + translate: pt(1.390, 0.483), rotate: 0, + id: 'C3' +}) +// mcu.pwr_cap[1].cap +const C4 = board.add(C_0603_1608Metric, { + translate: pt(1.554, 0.474), rotate: 0, + id: 'C4' +}) +// mcu.pwr_cap[2].cap +const C5 = board.add(C_0603_1608Metric, { + translate: pt(1.710, 0.474), rotate: 0, + id: 'C5' +}) +// mcu.pwr_cap[3].cap +const C6 = board.add(C_0603_1608Metric, { + translate: pt(1.866, 0.474), rotate: 0, + id: 'C6' +}) +// mcu.vdda_cap_0.cap +const C7 = board.add(C_0603_1608Metric, { + translate: pt(1.176, 0.647), rotate: 0, + id: 'C7' +}) +// mcu.vdda_cap_1.cap +const C8 = board.add(C_0603_1608Metric, { + translate: pt(1.332, 0.647), rotate: 0, + id: 'C8' +}) +// mcu.crystal.package +const X1 = board.add(Crystal_SMD_3225_4Pin_3_2x2_5mm, { + translate: pt(1.201, 0.512), rotate: 0, + id: 'X1' +}) +// mcu.crystal.cap_a +const C9 = board.add(C_0603_1608Metric, { + translate: pt(1.488, 0.647), rotate: 0, + id: 'C9' +}) +// mcu.crystal.cap_b +const C10 = board.add(C_0603_1608Metric, { + translate: pt(1.644, 0.647), rotate: 0, + id: 'C10' +}) +// mcu.swd.conn +const J2 = board.add(PinHeader_2x05_P1_27mm_Vertical_SMD, { + translate: pt(1.732, 0.146), rotate: 0, + id: 'J2' +}) +// mcu.usb_pull.dp +const R3 = board.add(R_0603_1608Metric, { + translate: pt(1.800, 0.647), rotate: 0, + id: 'R3' +}) +// led.package +const D1 = board.add(LED_0603_1608Metric, { + translate: pt(1.921, 0.823), rotate: 0, + id: 'D1' +}) +// led.res +const R4 = board.add(R_0603_1608Metric, { + translate: pt(1.920, 0.920), rotate: 0, + id: 'R4' +}) +// npx_shift.ic +const U3 = board.add(SOT_23_5, { + translate: pt(1.663, 0.861), rotate: 0, + id: 'U3' +}) +// npx_shift.vdd_cap.cap +const C17 = board.add(C_0603_1608Metric, { + translate: pt(1.641, 0.996), rotate: 0, + id: 'C17' +}) + +board.setNetlist([ + {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "1"], ["C11", "1"], ["D5", "1"], ["C12", "1"], ["D7", "1"], ["C13", "1"], ["D9", "1"], ["C14", "1"], ["D11", "1"], ["C15", "1"], ["D13", "1"], ["C16", "1"], ["U3", "5"], ["C17", "1"]]}, + {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"], ["D3", "3"], ["C11", "2"], ["D5", "3"], ["C12", "2"], ["D7", "3"], ["C13", "2"], ["D9", "3"], ["C14", "2"], ["D11", "3"], ["C15", "2"], ["D13", "3"], ["C16", "2"], ["U3", "1"], ["U3", "3"], ["C17", "2"]]}, + {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "33"], ["R3", "2"]]}, + {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "32"]]}, + {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, + {name: "usb.conn.cc.cc2", pads: [["J1", "B5"], ["R2", "2"]]}, + {name: "reg.pwr_out", pads: [["U1", "2"], ["C2", "1"], ["U2", "1"], ["U2", "24"], ["U2", "36"], ["U2", "48"], ["U2", "9"], ["C3", "1"], ["C4", "1"], ["C5", "1"], ["C6", "1"], ["C7", "1"], ["C8", "1"], ["J2", "1"], ["R3", "1"]]}, + {name: "mcu.gpio.cols_0", pads: [["U2", "12"], ["SW1", "1"], ["SW3", "1"], ["SW5", "1"]]}, + {name: "mcu.gpio.cols_1", pads: [["U2", "13"], ["SW2", "1"], ["SW4", "1"], ["SW6", "1"]]}, + {name: "mcu.gpio.rows_0", pads: [["U2", "14"], ["D2", "1"], ["D4", "1"]]}, + {name: "mcu.gpio.rows_1", pads: [["U2", "15"], ["D6", "1"], ["D8", "1"]]}, + {name: "mcu.gpio.rows_2", pads: [["U2", "16"], ["D10", "1"], ["D12", "1"]]}, + {name: "mcu.xtal_node.xi", pads: [["U2", "5"], ["X1", "1"], ["C9", "1"]]}, + {name: "mcu.xtal_node.xo", pads: [["U2", "6"], ["X1", "3"], ["C10", "1"]]}, + {name: "mcu.swd_node.swdio", pads: [["U2", "34"], ["J2", "2"]]}, + {name: "mcu.swd_node.swclk", pads: [["U2", "37"], ["J2", "4"]]}, + {name: "mcu.reset_node", pads: [["U2", "7"], ["J2", "10"]]}, + {name: "mcu.swd.tdi", pads: [["J2", "8"]]}, + {name: "mcu.swd.swo", pads: [["J2", "6"]]}, + {name: "led.signal", pads: [["U2", "10"], ["D1", "2"]]}, + {name: "led.package.k", pads: [["D1", "1"], ["R4", "1"]]}, + {name: "sw.npx_din", pads: [["D3", "4"], ["U3", "4"]]}, + {name: "sw.npx_dout", pads: [["D13", "2"]]}, + {name: "sw.sw[0,0].npx_dout", pads: [["D3", "2"], ["D5", "4"]]}, + {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, + {name: "sw.sw[1,0].npx_dout", pads: [["D5", "2"], ["D9", "4"]]}, + {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D4", "2"]]}, + {name: "sw.sw[0,1].npx_din", pads: [["D7", "4"], ["D9", "2"]]}, + {name: "sw.sw[0,1].npx_dout", pads: [["D7", "2"], ["D11", "4"]]}, + {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D6", "2"]]}, + {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D8", "2"]]}, + {name: "sw.sw[0,2].npx_dout", pads: [["D11", "2"], ["D13", "4"]]}, + {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D10", "2"]]}, + {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D12", "2"]]}, + {name: "npx_shift.input", pads: [["U2", "11"], ["U3", "2"]]} +]) + +const limit0 = pt(-0.07874015748031496, -0.07874015748031496); +const limit1 = pt(2.5795275590551188, 2.1181102362204722); +const xMin = Math.min(limit0[0], limit1[0]); +const xMax = Math.max(limit0[0], limit1[0]); +const yMin = Math.min(limit0[1], limit1[1]); +const yMax = Math.max(limit0[1], limit1[1]); + +const filletRadius = 0.1; +const outline = path( + [(xMin+xMax/2), yMax], + ["fillet", filletRadius, [xMax, yMax]], + ["fillet", filletRadius, [xMax, yMin]], + ["fillet", filletRadius, [xMin, yMin]], + ["fillet", filletRadius, [xMin, yMax]], + [(xMin+xMax/2), yMax], +); +board.addShape("outline", outline); + +renderPCB({ + pcb: board, + layerColors: { + "F.Paste": "#000000ff", + "F.Mask": "#000000ff", + "B.Mask": "#000000ff", + "componentLabels": "#00e5e5e5", + "outline": "#002d00ff", + "padLabels": "#ffff99e5", + "B.Cu": "#ef4e4eff", + "F.Cu": "#ff8c00cc", + }, + limits: { + x: [xMin, xMax], + y: [yMin, yMax] + }, + background: "#00000000", + mmPerUnit: 25.4 +}) + +function SwitchDiodeMatrixNeopixels_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { + // Circuit generator params + const ncols = 2 + const nrows = 3 + + // Global params + const traceSize = 0.015 + const viaTemplate = via(0.02, 0.035) + + // Return object + const obj = { + footprints: {}, + pts: {} + } + + // Actual generator code + allColWirePoints = [] + for (let yIndex=0; yIndex < nrows; yIndex++) { + colWirePoints = [] + rowDiodeVias = [] + + for (let xIndex=0; xIndex < ncols; xIndex++) { + index = yIndex * ncols + xIndex + 1 + + buttonPos = [xy[0] + colSpacing * xIndex, xy[1] + rowSpacing * yIndex] + obj.footprints[`SW${1 + xIndex * nrows + yIndex}`] = button = board.add( + SW_Hotswap_Kailh_MX, + { + translate: buttonPos, rotate: 0, + id: `SW${1 + xIndex * nrows + yIndex}` + }) + + diodePos = [buttonPos[0] + diodeOffset[0], buttonPos[1] + diodeOffset[1]] + obj[`D${2 + xIndex * nrows + yIndex}`] = diode = board.add( + D_SOD_323, + { + translate: diodePos, rotate: 90, + id: `D${2 + xIndex * nrows + yIndex}` + }) + + // create stub wire for button -> column common line + colWirePoint = [buttonPos[0], button.padY("2")] + board.wire([colWirePoint, button.pad("2")], traceSize, "F.Cu") + colWirePoints.push(colWirePoint) + + // create wire for button -> diode + board.wire([button.pad("1"), diode.pad("1")], traceSize, "F.Cu") + diodeViaPos = [diode.padX("2"), buttonPos[1] + rowSpacing / 2] + diodeVia = board.add(viaTemplate, {translate: diodeViaPos}) + board.wire([diode.pad("2"), diodeVia.pos], traceSize) + + if (rowDiodeVias.length > 0) { + board.wire([rowDiodeVias[rowDiodeVias.length - 1].pos, diodeVia.pos], traceSize, "B.Cu") + } + rowDiodeVias.push(diodeVia) + } + allColWirePoints.push(colWirePoints) + } + + // Inter-row wiring + for (let xIndex=0; xIndex < allColWirePoints[0].length; xIndex++) { + board.wire([ + allColWirePoints[0][xIndex], + allColWirePoints[allColWirePoints.length - 1][xIndex] + ], traceSize, "F.Cu") + } + + return obj +} + diff --git a/examples/TestBlinkySwitchMatrix/TestBlinkySwitchMatrix.net.ref b/examples/TestBlinkySwitchMatrix/TestBlinkySwitchMatrix.net.ref new file mode 100644 index 000000000..e40440e54 --- /dev/null +++ b/examples/TestBlinkySwitchMatrix/TestBlinkySwitchMatrix.net.ref @@ -0,0 +1,237 @@ +(export (version D) +(components +(comp (ref "U1") + (value "mcu") + (footprint "Seeed Studio XIAO Series Library:XIAO-RP2040-SMD") + (property (name "Sheetname") (value "")) + (property (name "Sheetfile") (value "")) + (property (name "edg_path") (value "mcu.device")) + (property (name "edg_short_path") (value "mcu")) + (property (name "edg_refdes") (value "U1")) + (property (name "edg_part") (value "XIAO RP2040")) + (property (name "edg_value") (value "XIAO RP2040")) + (sheetpath (names "/") (tstamps "/")) + (tstamps "02850146")) +(comp (ref "D1") + (value "led.package") + (footprint "LED_SMD:LED_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.package")) + (property (name "edg_short_path") (value "led.package")) + (property (name "edg_refdes") (value "D1")) + (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) + (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0b4e02cd")) +(comp (ref "R1") + (value "led.res") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.res")) + (property (name "edg_short_path") (value "led.res")) + (property (name "edg_refdes") (value "R1")) + (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0296014b")) +(comp (ref "SW1") + (value "sw.sw[0,0].sw") + (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,0].sw")) + (property (name "edg_short_path") (value "sw.sw[0,0].sw")) + (property (name "edg_refdes") (value "SW1")) + (property (name "edg_part") (value "5.1mm switch")) + (property (name "edg_value") (value "5.1mm switch")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "015f00eb")) +(comp (ref "D2") + (value "sw.sw[0,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,0].d")) + (property (name "edg_short_path") (value "sw.sw[0,0].d")) + (property (name "edg_refdes") (value "D2")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) + (tstamps "00650065")) +(comp (ref "SW2") + (value "sw.sw[1,0].sw") + (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,0].sw")) + (property (name "edg_short_path") (value "sw.sw[1,0].sw")) + (property (name "edg_refdes") (value "SW2")) + (property (name "edg_part") (value "5.1mm switch")) + (property (name "edg_value") (value "5.1mm switch")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "015f00eb")) +(comp (ref "D3") + (value "sw.sw[1,0].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,0]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,0].d")) + (property (name "edg_short_path") (value "sw.sw[1,0].d")) + (property (name "edg_refdes") (value "D3")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) + (tstamps "00650065")) +(comp (ref "SW3") + (value "sw.sw[0,1].sw") + (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,1].sw")) + (property (name "edg_short_path") (value "sw.sw[0,1].sw")) + (property (name "edg_refdes") (value "SW3")) + (property (name "edg_part") (value "5.1mm switch")) + (property (name "edg_value") (value "5.1mm switch")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "015f00eb")) +(comp (ref "D4") + (value "sw.sw[0,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,1].d")) + (property (name "edg_short_path") (value "sw.sw[0,1].d")) + (property (name "edg_refdes") (value "D4")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) + (tstamps "00650065")) +(comp (ref "SW4") + (value "sw.sw[1,1].sw") + (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,1].sw")) + (property (name "edg_short_path") (value "sw.sw[1,1].sw")) + (property (name "edg_refdes") (value "SW4")) + (property (name "edg_part") (value "5.1mm switch")) + (property (name "edg_value") (value "5.1mm switch")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "015f00eb")) +(comp (ref "D5") + (value "sw.sw[1,1].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,1]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,1].d")) + (property (name "edg_short_path") (value "sw.sw[1,1].d")) + (property (name "edg_refdes") (value "D5")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) + (tstamps "00650065")) +(comp (ref "SW5") + (value "sw.sw[0,2].sw") + (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,2].sw")) + (property (name "edg_short_path") (value "sw.sw[0,2].sw")) + (property (name "edg_refdes") (value "SW5")) + (property (name "edg_part") (value "5.1mm switch")) + (property (name "edg_value") (value "5.1mm switch")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "015f00eb")) +(comp (ref "D6") + (value "sw.sw[0,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[0,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[0,2].d")) + (property (name "edg_short_path") (value "sw.sw[0,2].d")) + (property (name "edg_refdes") (value "D6")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) + (tstamps "00650065")) +(comp (ref "SW6") + (value "sw.sw[1,2].sw") + (footprint "Button_Switch_SMD:SW_SPST_SKQG_WithoutStem") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,2].sw")) + (property (name "edg_short_path") (value "sw.sw[1,2].sw")) + (property (name "edg_refdes") (value "SW6")) + (property (name "edg_part") (value "5.1mm switch")) + (property (name "edg_value") (value "5.1mm switch")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "015f00eb")) +(comp (ref "D7") + (value "sw.sw[1,2].d") + (footprint "Diode_SMD:D_SOD-323") + (property (name "Sheetname") (value "sw[1,2]")) + (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) + (property (name "edg_path") (value "sw.sw[1,2].d")) + (property (name "edg_short_path") (value "sw.sw[1,2].d")) + (property (name "edg_refdes") (value "D7")) + (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) + (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) + (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) + (tstamps "00650065"))) +(nets +(net (code 1) (name "mcu.gpio.cols_0") + (node (ref U1) (pin 8)) + (node (ref SW1) (pin 1)) + (node (ref SW3) (pin 1)) + (node (ref SW5) (pin 1))) +(net (code 2) (name "mcu.gpio.cols_1") + (node (ref U1) (pin 9)) + (node (ref SW2) (pin 1)) + (node (ref SW4) (pin 1)) + (node (ref SW6) (pin 1))) +(net (code 3) (name "mcu.gpio.rows_0") + (node (ref U1) (pin 11)) + (node (ref D2) (pin 1)) + (node (ref D3) (pin 1))) +(net (code 4) (name "mcu.gpio.rows_1") + (node (ref U1) (pin 10)) + (node (ref D4) (pin 1)) + (node (ref D5) (pin 1))) +(net (code 5) (name "mcu.gpio.rows_2") + (node (ref U1) (pin 5)) + (node (ref D6) (pin 1)) + (node (ref D7) (pin 1))) +(net (code 6) (name "mcu.gnd") + (node (ref U1) (pin 13)) + (node (ref R1) (pin 2))) +(net (code 7) (name "mcu.pwr_out") + (node (ref U1) (pin 12))) +(net (code 8) (name "mcu.vusb_out") + (node (ref U1) (pin 14))) +(net (code 9) (name "led.signal") + (node (ref U1) (pin 7)) + (node (ref D1) (pin 2))) +(net (code 10) (name "led.package.k") + (node (ref D1) (pin 1)) + (node (ref R1) (pin 1))) +(net (code 11) (name "sw.sw[0,0].sw.com") + (node (ref SW1) (pin 2)) + (node (ref D2) (pin 2))) +(net (code 12) (name "sw.sw[1,0].sw.com") + (node (ref SW2) (pin 2)) + (node (ref D3) (pin 2))) +(net (code 13) (name "sw.sw[0,1].sw.com") + (node (ref SW3) (pin 2)) + (node (ref D4) (pin 2))) +(net (code 14) (name "sw.sw[1,1].sw.com") + (node (ref SW4) (pin 2)) + (node (ref D5) (pin 2))) +(net (code 15) (name "sw.sw[0,2].sw.com") + (node (ref SW5) (pin 2)) + (node (ref D6) (pin 2))) +(net (code 16) (name "sw.sw[1,2].sw.com") + (node (ref SW6) (pin 2)) + (node (ref D7) (pin 2)))) +) \ No newline at end of file diff --git a/examples/TestBlinkySwitchMatrix/TestBlinkySwitchMatrix.svgpcb.js b/examples/TestBlinkySwitchMatrix/TestBlinkySwitchMatrix.svgpcb.js new file mode 100644 index 000000000..1d828d5bc --- /dev/null +++ b/examples/TestBlinkySwitchMatrix/TestBlinkySwitchMatrix.svgpcb.js @@ -0,0 +1,146 @@ +const board = new PCB(); + +const sw = SwitchDiodeMatrix_2_3_sw(pt(0.039, 0.039)) +// mcu.device +const U1 = board.add(XIAO_RP2040_SMD, { + translate: pt(1.466, 0.410), rotate: 0, + id: 'U1' +}) +// led.package +const D1 = board.add(LED_0603_1608Metric, { + translate: pt(1.995, 0.029), rotate: 0, + id: 'D1' +}) +// led.res +const R1 = board.add(R_0603_1608Metric, { + translate: pt(1.994, 0.126), rotate: 0, + id: 'R1' +}) + +board.setNetlist([ + {name: "mcu.gpio.cols_0", pads: [["U1", "8"], ["SW1", "1"], ["SW3", "1"], ["SW5", "1"]]}, + {name: "mcu.gpio.cols_1", pads: [["U1", "9"], ["SW2", "1"], ["SW4", "1"], ["SW6", "1"]]}, + {name: "mcu.gpio.rows_0", pads: [["U1", "11"], ["D2", "1"], ["D3", "1"]]}, + {name: "mcu.gpio.rows_1", pads: [["U1", "10"], ["D4", "1"], ["D5", "1"]]}, + {name: "mcu.gpio.rows_2", pads: [["U1", "5"], ["D6", "1"], ["D7", "1"]]}, + {name: "mcu.gnd", pads: [["U1", "13"], ["R1", "2"]]}, + {name: "mcu.pwr_out", pads: [["U1", "12"]]}, + {name: "mcu.vusb_out", pads: [["U1", "14"]]}, + {name: "led.signal", pads: [["U1", "7"], ["D1", "2"]]}, + {name: "led.package.k", pads: [["D1", "1"], ["R1", "1"]]}, + {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, + {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D3", "2"]]}, + {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D4", "2"]]}, + {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D5", "2"]]}, + {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D6", "2"]]}, + {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D7", "2"]]} +]) + +const limit0 = pt(-0.07874015748031496, -0.07874015748031496); +const limit1 = pt(2.171062992125984, 2.1181102362204722); +const xMin = Math.min(limit0[0], limit1[0]); +const xMax = Math.max(limit0[0], limit1[0]); +const yMin = Math.min(limit0[1], limit1[1]); +const yMax = Math.max(limit0[1], limit1[1]); + +const filletRadius = 0.1; +const outline = path( + [(xMin+xMax/2), yMax], + ["fillet", filletRadius, [xMax, yMax]], + ["fillet", filletRadius, [xMax, yMin]], + ["fillet", filletRadius, [xMin, yMin]], + ["fillet", filletRadius, [xMin, yMax]], + [(xMin+xMax/2), yMax], +); +board.addShape("outline", outline); + +renderPCB({ + pcb: board, + layerColors: { + "F.Paste": "#000000ff", + "F.Mask": "#000000ff", + "B.Mask": "#000000ff", + "componentLabels": "#00e5e5e5", + "outline": "#002d00ff", + "padLabels": "#ffff99e5", + "B.Cu": "#ef4e4eff", + "F.Cu": "#ff8c00cc", + }, + limits: { + x: [xMin, xMax], + y: [yMin, yMax] + }, + background: "#00000000", + mmPerUnit: 25.4 +}) + +function SwitchDiodeMatrix_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffset=[0.25, 0]) { + // Circuit generator params + const ncols = 2 + const nrows = 3 + + // Global params + const traceSize = 0.015 + const viaTemplate = via(0.02, 0.035) + + // Return object + const obj = { + footprints: {}, + pts: {} + } + + // Actual generator code + allColWirePoints = [] + for (let yIndex=0; yIndex < nrows; yIndex++) { + colWirePoints = [] + rowDiodeVias = [] + + for (let xIndex=0; xIndex < ncols; xIndex++) { + index = yIndex * ncols + xIndex + 1 + + buttonPos = [xy[0] + colSpacing * xIndex, xy[1] + rowSpacing * yIndex] + obj.footprints[`SW${1 + xIndex * nrows + yIndex}`] = button = board.add( + SW_SPST_SKQG_WithoutStem, + { + translate: buttonPos, rotate: 0, + id: `SW${1 + xIndex * nrows + yIndex}` + }) + + diodePos = [buttonPos[0] + diodeOffset[0], buttonPos[1] + diodeOffset[1]] + obj[`D${2 + xIndex * nrows + yIndex}`] = diode = board.add( + D_SOD_323, + { + translate: diodePos, rotate: 90, + id: `D${2 + xIndex * nrows + yIndex}` + }) + + // create stub wire for button -> column common line + colWirePoint = [buttonPos[0], button.padY("2")] + board.wire([colWirePoint, button.pad("2")], traceSize, "F.Cu") + colWirePoints.push(colWirePoint) + + // create wire for button -> diode + board.wire([button.pad("1"), diode.pad("1")], traceSize, "F.Cu") + diodeViaPos = [diode.padX("2"), buttonPos[1] + rowSpacing / 2] + diodeVia = board.add(viaTemplate, {translate: diodeViaPos}) + board.wire([diode.pad("2"), diodeVia.pos], traceSize) + + if (rowDiodeVias.length > 0) { + board.wire([rowDiodeVias[rowDiodeVias.length - 1].pos, diodeVia.pos], traceSize, "B.Cu") + } + rowDiodeVias.push(diodeVia) + } + allColWirePoints.push(colWirePoints) + } + + // Inter-row wiring + for (let xIndex=0; xIndex < allColWirePoints[0].length; xIndex++) { + board.wire([ + allColWirePoints[0][xIndex], + allColWirePoints[allColWirePoints.length - 1][xIndex] + ], traceSize, "F.Cu") + } + + return obj +} + diff --git a/examples/BasicKeyboard/BasicKeyboard.net.ref b/examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.net.ref similarity index 80% rename from examples/BasicKeyboard/BasicKeyboard.net.ref rename to examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.net.ref index 5cea2a5b3..a911d816e 100644 --- a/examples/BasicKeyboard/BasicKeyboard.net.ref +++ b/examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.net.ref @@ -12,6 +12,30 @@ (property (name "edg_value") (value "XIAO RP2040")) (sheetpath (names "/") (tstamps "/")) (tstamps "02850146")) +(comp (ref "D1") + (value "led.package") + (footprint "LED_SMD:LED_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.package")) + (property (name "edg_short_path") (value "led.package")) + (property (name "edg_refdes") (value "D1")) + (property (name "edg_part") (value "KT-0603R (Hubei KENTO Elec)")) + (property (name "edg_value") (value "Red 615~630nm 1.9~2.2V 0603 Light Emitting Diodes (LED) RoHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0b4e02cd")) +(comp (ref "R1") + (value "led.res") + (footprint "Resistor_SMD:R_0603_1608Metric") + (property (name "Sheetname") (value "led")) + (property (name "Sheetfile") (value "edg.abstract_parts.Led.IndicatorLed")) + (property (name "edg_path") (value "led.res")) + (property (name "edg_short_path") (value "led.res")) + (property (name "edg_refdes") (value "R1")) + (property (name "edg_part") (value "0603WAF1001T5E (UNI-ROYAL(Uniroyal Elec))")) + (property (name "edg_value") (value "±1% 1/10W Thick Film Resistors 75V ±100ppm/℃ -55℃~+155℃ 1kΩ 0603 Chip Resistor - Surface Mount ROHS")) + (sheetpath (names "/led/") (tstamps "/02750136/")) + (tstamps "0296014b")) (comp (ref "SW1") (value "sw.sw[0,0].sw") (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") @@ -24,14 +48,14 @@ (property (name "edg_value") (value "PG151101S11")) (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) (tstamps "015f00eb")) -(comp (ref "D1") +(comp (ref "D2") (value "sw.sw[0,0].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[0,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,0].d")) (property (name "edg_short_path") (value "sw.sw[0,0].d")) - (property (name "edg_refdes") (value "D1")) + (property (name "edg_refdes") (value "D2")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) (sheetpath (names "/sw/sw[0,0]/") (tstamps "/015f00eb/09be022f/")) @@ -48,14 +72,14 @@ (property (name "edg_value") (value "PG151101S11")) (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) (tstamps "015f00eb")) -(comp (ref "D2") +(comp (ref "D3") (value "sw.sw[1,0].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[1,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,0].d")) (property (name "edg_short_path") (value "sw.sw[1,0].d")) - (property (name "edg_refdes") (value "D2")) + (property (name "edg_refdes") (value "D3")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) (sheetpath (names "/sw/sw[1,0]/") (tstamps "/015f00eb/09c20230/")) @@ -72,14 +96,14 @@ (property (name "edg_value") (value "PG151101S11")) (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) (tstamps "015f00eb")) -(comp (ref "D3") +(comp (ref "D4") (value "sw.sw[0,1].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[0,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,1].d")) (property (name "edg_short_path") (value "sw.sw[0,1].d")) - (property (name "edg_refdes") (value "D3")) + (property (name "edg_refdes") (value "D4")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) (sheetpath (names "/sw/sw[0,1]/") (tstamps "/015f00eb/09c00230/")) @@ -96,14 +120,14 @@ (property (name "edg_value") (value "PG151101S11")) (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) (tstamps "015f00eb")) -(comp (ref "D4") +(comp (ref "D5") (value "sw.sw[1,1].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[1,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,1].d")) (property (name "edg_short_path") (value "sw.sw[1,1].d")) - (property (name "edg_refdes") (value "D4")) + (property (name "edg_refdes") (value "D5")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) (sheetpath (names "/sw/sw[1,1]/") (tstamps "/015f00eb/09c40231/")) @@ -120,14 +144,14 @@ (property (name "edg_value") (value "PG151101S11")) (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) (tstamps "015f00eb")) -(comp (ref "D5") +(comp (ref "D6") (value "sw.sw[0,2].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[0,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,2].d")) (property (name "edg_short_path") (value "sw.sw[0,2].d")) - (property (name "edg_refdes") (value "D5")) + (property (name "edg_refdes") (value "D6")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) (sheetpath (names "/sw/sw[0,2]/") (tstamps "/015f00eb/09c20231/")) @@ -144,63 +168,70 @@ (property (name "edg_value") (value "PG151101S11")) (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) (tstamps "015f00eb")) -(comp (ref "D6") +(comp (ref "D7") (value "sw.sw[1,2].d") (footprint "Diode_SMD:D_SOD-323") (property (name "Sheetname") (value "sw[1,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,2].d")) (property (name "edg_short_path") (value "sw.sw[1,2].d")) - (property (name "edg_refdes") (value "D6")) + (property (name "edg_refdes") (value "D7")) (property (name "edg_part") (value "1N5819WS (Guangdong Hottech)")) (property (name "edg_value") (value "40V 600mV@1A 1A SOD-323 Schottky Barrier Diodes (SBD) ROHS")) (sheetpath (names "/sw/sw[1,2]/") (tstamps "/015f00eb/09c60232/")) (tstamps "00650065"))) (nets -(net (code 1) (name "mcu.gpio.0_0") - (node (ref U1) (pin 7)) +(net (code 1) (name "mcu.gpio.cols_0") + (node (ref U1) (pin 8)) (node (ref SW1) (pin 1)) (node (ref SW3) (pin 1)) (node (ref SW5) (pin 1))) -(net (code 2) (name "mcu.gpio.0_1") - (node (ref U1) (pin 8)) +(net (code 2) (name "mcu.gpio.cols_1") + (node (ref U1) (pin 9)) (node (ref SW2) (pin 1)) (node (ref SW4) (pin 1)) (node (ref SW6) (pin 1))) -(net (code 3) (name "mcu.gpio.1_0") - (node (ref U1) (pin 9)) - (node (ref D1) (pin 1)) - (node (ref D2) (pin 1))) -(net (code 4) (name "mcu.gpio.1_1") +(net (code 3) (name "mcu.gpio.rows_0") (node (ref U1) (pin 11)) - (node (ref D3) (pin 1)) - (node (ref D4) (pin 1))) -(net (code 5) (name "mcu.gpio.1_2") + (node (ref D2) (pin 1)) + (node (ref D3) (pin 1))) +(net (code 4) (name "mcu.gpio.rows_1") (node (ref U1) (pin 10)) - (node (ref D5) (pin 1)) - (node (ref D6) (pin 1))) + (node (ref D4) (pin 1)) + (node (ref D5) (pin 1))) +(net (code 5) (name "mcu.gpio.rows_2") + (node (ref U1) (pin 5)) + (node (ref D6) (pin 1)) + (node (ref D7) (pin 1))) (net (code 6) (name "mcu.gnd") - (node (ref U1) (pin 13))) + (node (ref U1) (pin 13)) + (node (ref R1) (pin 2))) (net (code 7) (name "mcu.pwr_out") (node (ref U1) (pin 12))) (net (code 8) (name "mcu.vusb_out") (node (ref U1) (pin 14))) -(net (code 9) (name "sw.sw[0,0].sw.com") - (node (ref SW1) (pin 2)) +(net (code 9) (name "led.signal") + (node (ref U1) (pin 7)) (node (ref D1) (pin 2))) -(net (code 10) (name "sw.sw[1,0].sw.com") - (node (ref SW2) (pin 2)) +(net (code 10) (name "led.package.k") + (node (ref D1) (pin 1)) + (node (ref R1) (pin 1))) +(net (code 11) (name "sw.sw[0,0].sw.com") + (node (ref SW1) (pin 2)) (node (ref D2) (pin 2))) -(net (code 11) (name "sw.sw[0,1].sw.com") - (node (ref SW3) (pin 2)) +(net (code 12) (name "sw.sw[1,0].sw.com") + (node (ref SW2) (pin 2)) (node (ref D3) (pin 2))) -(net (code 12) (name "sw.sw[1,1].sw.com") - (node (ref SW4) (pin 2)) +(net (code 13) (name "sw.sw[0,1].sw.com") + (node (ref SW3) (pin 2)) (node (ref D4) (pin 2))) -(net (code 13) (name "sw.sw[0,2].sw.com") - (node (ref SW5) (pin 2)) +(net (code 14) (name "sw.sw[1,1].sw.com") + (node (ref SW4) (pin 2)) (node (ref D5) (pin 2))) -(net (code 14) (name "sw.sw[1,2].sw.com") +(net (code 15) (name "sw.sw[0,2].sw.com") + (node (ref SW5) (pin 2)) + (node (ref D6) (pin 2))) +(net (code 16) (name "sw.sw[1,2].sw.com") (node (ref SW6) (pin 2)) - (node (ref D6) (pin 2)))) + (node (ref D7) (pin 2)))) ) \ No newline at end of file diff --git a/examples/BasicKeyboard/BasicKeyboard.svgpcb.js b/examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.svgpcb.js similarity index 70% rename from examples/BasicKeyboard/BasicKeyboard.svgpcb.js rename to examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.svgpcb.js index 20fd95ab7..dd763386c 100644 --- a/examples/BasicKeyboard/BasicKeyboard.svgpcb.js +++ b/examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.svgpcb.js @@ -6,26 +6,38 @@ const U1 = board.add(XIAO_RP2040_SMD, { translate: pt(1.466, 0.410), rotate: 0, id: 'U1' }) +// led.package +const D1 = board.add(LED_0603_1608Metric, { + translate: pt(1.995, 0.029), rotate: 0, + id: 'D1' +}) +// led.res +const R1 = board.add(R_0603_1608Metric, { + translate: pt(1.994, 0.126), rotate: 0, + id: 'R1' +}) board.setNetlist([ - {name: "mcu.gpio.0_0", pads: [["U1", "7"], ["SW1", "1"], ["SW3", "1"], ["SW5", "1"]]}, - {name: "mcu.gpio.0_1", pads: [["U1", "8"], ["SW2", "1"], ["SW4", "1"], ["SW6", "1"]]}, - {name: "mcu.gpio.1_0", pads: [["U1", "9"], ["D1", "1"], ["D2", "1"]]}, - {name: "mcu.gpio.1_1", pads: [["U1", "11"], ["D3", "1"], ["D4", "1"]]}, - {name: "mcu.gpio.1_2", pads: [["U1", "10"], ["D5", "1"], ["D6", "1"]]}, - {name: "mcu.gnd", pads: [["U1", "13"]]}, + {name: "mcu.gpio.cols_0", pads: [["U1", "8"], ["SW1", "1"], ["SW3", "1"], ["SW5", "1"]]}, + {name: "mcu.gpio.cols_1", pads: [["U1", "9"], ["SW2", "1"], ["SW4", "1"], ["SW6", "1"]]}, + {name: "mcu.gpio.rows_0", pads: [["U1", "11"], ["D2", "1"], ["D3", "1"]]}, + {name: "mcu.gpio.rows_1", pads: [["U1", "10"], ["D4", "1"], ["D5", "1"]]}, + {name: "mcu.gpio.rows_2", pads: [["U1", "5"], ["D6", "1"], ["D7", "1"]]}, + {name: "mcu.gnd", pads: [["U1", "13"], ["R1", "2"]]}, {name: "mcu.pwr_out", pads: [["U1", "12"]]}, {name: "mcu.vusb_out", pads: [["U1", "14"]]}, - {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D1", "2"]]}, - {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D2", "2"]]}, - {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D3", "2"]]}, - {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D4", "2"]]}, - {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D5", "2"]]}, - {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D6", "2"]]} + {name: "led.signal", pads: [["U1", "7"], ["D1", "2"]]}, + {name: "led.package.k", pads: [["D1", "1"], ["R1", "1"]]}, + {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, + {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D3", "2"]]}, + {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D4", "2"]]}, + {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D5", "2"]]}, + {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D6", "2"]]}, + {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D7", "2"]]} ]) const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(1.936220472440945, 2.1181102362204722); +const limit1 = pt(2.171062992125984, 2.1181102362204722); const xMin = Math.min(limit0[0], limit1[0]); const xMax = Math.max(limit0[0], limit1[0]); const yMin = Math.min(limit0[1], limit1[1]); @@ -95,11 +107,11 @@ function SwitchDiodeMatrix_2_3_sw(xy, colSpacing=0.5, rowSpacing=0.5, diodeOffse }) diodePos = [buttonPos[0] + diodeOffset[0], buttonPos[1] + diodeOffset[1]] - obj[`D${1 + xIndex * nrows + yIndex}`] = diode = board.add( + obj[`D${2 + xIndex * nrows + yIndex}`] = diode = board.add( D_SOD_323, { translate: diodePos, rotate: 90, - id: `D${1 + xIndex * nrows + yIndex}` + id: `D${2 + xIndex * nrows + yIndex}` }) // create stub wire for button -> column common line diff --git a/examples/TofArray/TofArray.net.ref b/examples/TofArray/TofArray.net.ref index 41faab2a8..7b494f011 100644 --- a/examples/TofArray/TofArray.net.ref +++ b/examples/TofArray/TofArray.net.ref @@ -172,7 +172,7 @@ (value "mcu.ic") (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.ic")) (property (name "edg_short_path") (value "mcu.ic")) (property (name "edg_refdes") (value "U2")) @@ -184,7 +184,7 @@ (value "mcu.pwr_cap[0]") (footprint "Capacitor_SMD:C_0805_2012Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[0].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[0]")) (property (name "edg_refdes") (value "C3")) @@ -196,7 +196,7 @@ (value "mcu.pwr_cap[1]") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[1].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[1]")) (property (name "edg_refdes") (value "C4")) @@ -208,7 +208,7 @@ (value "mcu.pwr_cap[2]") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[2].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[2]")) (property (name "edg_refdes") (value "C5")) @@ -220,7 +220,7 @@ (value "mcu.pwr_cap[3]") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.pwr_cap[3].cap")) (property (name "edg_short_path") (value "mcu.pwr_cap[3]")) (property (name "edg_refdes") (value "C6")) @@ -232,7 +232,7 @@ (value "mcu.vdda_cap_0") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.vdda_cap_0.cap")) (property (name "edg_short_path") (value "mcu.vdda_cap_0")) (property (name "edg_refdes") (value "C7")) @@ -244,7 +244,7 @@ (value "mcu.vdda_cap_1") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.vdda_cap_1.cap")) (property (name "edg_short_path") (value "mcu.vdda_cap_1")) (property (name "edg_refdes") (value "C8")) @@ -292,7 +292,7 @@ (value "mcu.swd") (footprint "Connector:Tag-Connect_TC2030-IDC-FP_2x03_P1.27mm_Vertical") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.swd.conn")) (property (name "edg_short_path") (value "mcu.swd")) (property (name "edg_refdes") (value "J3")) @@ -304,7 +304,7 @@ (value "mcu.usb_pull") (footprint "Resistor_SMD:R_0603_1608Metric") (property (name "Sheetname") (value "mcu")) - (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103_48")) + (property (name "Sheetfile") (value "edg.parts.microcontroller.Stm32f103.Stm32f103")) (property (name "edg_path") (value "mcu.usb_pull.dp")) (property (name "edg_short_path") (value "mcu.usb_pull")) (property (name "edg_refdes") (value "R3")) diff --git a/examples/test_blinky.py b/examples/test_blinky.py index 27064d251..2ed207a66 100644 --- a/examples/test_blinky.py +++ b/examples/test_blinky.py @@ -89,7 +89,7 @@ def contents(self) -> None: def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ - (IoController, Stm32f103_48), + (IoController, Stm32f103), (Switch, KailhSocket), ], ) @@ -119,7 +119,7 @@ def contents(self) -> None: def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ - (IoController, Stm32f103_48), + (IoController, Stm32f103), (Switch, KailhSocket), ], ) @@ -153,7 +153,7 @@ def contents(self) -> None: def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ - (IoController, Stm32f103_48), + (IoController, Stm32f103), (Switch, KailhSocket), ], ) @@ -197,7 +197,7 @@ def contents(self) -> None: def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ - (IoController, Stm32f103_48), + (IoController, Stm32f103), (Switch, KailhSocket), (Neopixel, Sk6812Mini_E), ], @@ -245,7 +245,7 @@ def contents(self) -> None: def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ - (IoController, Stm32f103_48), + (IoController, Stm32f103), (Switch, KailhSocket), (Neopixel, Sk6812Mini_E), ], @@ -293,7 +293,7 @@ def contents(self) -> None: def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ - (IoController, Stm32f103_48), + (IoController, Stm32f103), (Switch, KailhSocket), (Neopixel, Sk6812Mini_E), ], @@ -302,11 +302,11 @@ def refinements(self) -> Refinements: ["mcu", "pin_assigns"], [ "led=10", - "sw_col_0=16", - "sw_col_1=17", - "sw_col_2=18", - "sw_row_0=19", - "sw_row_1=20", + "cols_0=16", + "cols_1=17", + "rows_0=18", + "rows_1=19", + "rows_2=20", ], ) ], @@ -729,8 +729,7 @@ def test_design_invalid(self) -> None: compile_board_inplace(TestBlinkyInvalid, False) def test_design_regulated(self) -> None: - with self.assertRaises(CompilerCheckError): - compile_board_inplace(TestBlinkyRegulated, False) + run_test_board(TestBlinkyRegulated) def test_design_rgb(self) -> None: run_test_board(TestBlinkyRgb) diff --git a/examples/test_robotcrawler.py b/examples/test_robotcrawler.py index 8f2b3110f..d68e6c5e8 100644 --- a/examples/test_robotcrawler.py +++ b/examples/test_robotcrawler.py @@ -172,7 +172,7 @@ def refinements(self) -> Refinements: return super().refinements() + Refinements( instance_refinements=[ (["mcu"], Esp32s3_Wroom_1), - (["mcu_servo"], Stm32f103_48), + (["mcu_servo"], Stm32f103), (["mcu_test"], Rp2040), (["reg_3v3"], Ap7215), (["reg_2v5"], Xc6206p), diff --git a/examples/test_swd_debugger.py b/examples/test_swd_debugger.py index 1df1ab7cf..923237d54 100644 --- a/examples/test_swd_debugger.py +++ b/examples/test_swd_debugger.py @@ -163,7 +163,7 @@ def contents(self) -> None: def refinements(self) -> Refinements: return super().refinements() + Refinements( instance_refinements=[ - (["mcu"], Stm32f103_48), + (["mcu"], Stm32f103), (["mcu", "crystal"], Cstne), (["usb_reg"], Ap2204k), (["target_reg"], Ap2204k), diff --git a/examples/test_tofarray.py b/examples/test_tofarray.py index 8dca22d0a..fad9df4e6 100644 --- a/examples/test_tofarray.py +++ b/examples/test_tofarray.py @@ -130,7 +130,7 @@ def multipack(self) -> None: def refinements(self) -> Refinements: return super().refinements() + Refinements( instance_refinements=[ - (["mcu"], Stm32f103_48), + (["mcu"], Stm32f103), (["reg_3v3"], Ldl1117), # TBD find one that is in stock (["spk", "conn"], JstPhKVertical), (["can", "conn"], MolexSl), diff --git a/getting-started.md b/getting-started.md index 8ff07ed99..aa7411bb6 100644 --- a/getting-started.md +++ b/getting-started.md @@ -415,7 +415,7 @@ Because blocks encapsulate their subcircuits, using a discrete microcontroller i def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ -+ (IoController, Stm32f103_48), ++ (IoController, Stm32f103), (Switch, KailhSocket), ], ) @@ -534,7 +534,7 @@ This is supported through **mixins**. def refinements(self) -> Refinements: return super().refinements() + Refinements( class_refinements=[ - (IoController, Stm32f103_48), + (IoController, Stm32f103), (Switch, KailhSocket), + (Neopixel, Sk6812Mini_E), ], @@ -639,11 +639,11 @@ Let's arbitrarily choose pins 26-29 for the LEDs. + instance_values=[ + (['mcu', 'pin_assigns'], [ + 'led=10', -+ 'sw_col_0=16', -+ 'sw_col_1=17', -+ 'sw_col_2=18', -+ 'sw_row_0=19', -+ 'sw_row_1=20', ++ 'cols_0=16', ++ 'cols_1=17', ++ 'rows_0=18', ++ 'rows_1=19', ++ 'rows_2=20', + ]) ]) ``` From c4357017d10bf0e14fd31e8fa02d1d9e1ee47552 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Fri, 3 Jul 2026 20:12:01 -0700 Subject: [PATCH 24/41] wip --- docs/kicad/app_pcb_editor.png | Bin 0 -> 23093 bytes docs/kicad/pcb_netlist.png | Bin 0 -> 1199 bytes docs/kicad/pcm_keyswitch_library.png | Bin 0 -> 52562 bytes docs/kicad/pcm_sublayout.png | Bin 0 -> 58643 bytes edg/vendor_parts/TactileSwitches.py | 9 ++---- examples/test_blinky.py | 6 ++-- getting-started.md | 5 ++-- getting_started_hierarchy_layout.md | 40 +++++++++++++++++++++++++++ 8 files changed, 49 insertions(+), 11 deletions(-) create mode 100644 docs/kicad/app_pcb_editor.png create mode 100644 docs/kicad/pcb_netlist.png create mode 100644 docs/kicad/pcm_keyswitch_library.png create mode 100644 docs/kicad/pcm_sublayout.png diff --git a/docs/kicad/app_pcb_editor.png b/docs/kicad/app_pcb_editor.png new file mode 100644 index 0000000000000000000000000000000000000000..83f81db5e4705bd5a25010613be7b614a8e2b841 GIT binary patch literal 23093 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 literal 0 HcmV?d00001 diff --git a/docs/kicad/pcb_netlist.png b/docs/kicad/pcb_netlist.png new file mode 100644 index 0000000000000000000000000000000000000000..61572b39b75ca0b0dcac4f70c367ccb4dbca5492 GIT binary patch literal 1199 zcmV;g1W@~lP))HFW?6_)c+rRt>TrpX1f=rNhV5Z5^W$ZH)W+|q#L1jQ zAr?j`urVFB%_`Aaa9{vaYAL0*^aH;l_`!x~%{2J8|6}gm<=k6(ZhJ43xtsiQ&bc4w z-t)`(|L=cBR#p~B@zG}Elt6z+x-f%2!GRw=d-1AC<$qC({HH{Hp1T!{b-%++=Pl^* zc#{I3t*UP#b4?pj8jVJD5|I*x3-bs1VPIfD5d!_eakA1?6gpxOmHB-=Wa=-#CkM>1 z;E*M0HdI~{$*RBj2eT+oXAguuAs!sl_oxB8sJ)GlUwZ?NI(#s9|0O~}T?c$~!AbhH zt~+27P*mSJZj2nb+6QaTUKNSz?ej5AY*C$epF-gAC@ef| z6^Z)vgpJ>A9Ghy|p?7eEAFC-!O=OG05IXs108X^}MWXKh9fg6vUV!uduxg^FMULV` z;cn`GG77);+?(_rHB}@f3Ky)2<)b$-IYLpNm0pIAV}C_t-uo{m|3r5Ej5C{B`HA!)5C2(1sY$k|L^%pW3U>=FB_4yi-H^K?Tl5~9ltg(v9;mFWByC$;8O7@O)&Q05k!Bek(7kjMt2-1=P^|2_t2yy%4V~HR;wj#MMVV^7Z)?5)9FaK$`wT? zZ+gt-rA_QK&hUlr9xRMaeQ}laiQWB*UN{PbqV0hQ5cLKgPz(4j5Ue?&q6G=&v z5_&F|i-a7ucDo%)OG}x-=e%C8qM{HiCV2@$S#cyGr`1U2F1LplRb5?8@(s2IgF%#s z62X-RUf*qIQHgSts60Sf))si}_Df277|UsE)F=;X8?FC_OdtRji-ojqw;LK78koT! z0Qcwn&D_i^iUlkpSqskXY89Nz*J~jt__e1>C=`YjU+NSUg`g}<(zG1mPGXgW5K;6= z4k=Mcc3ufsn;j4iheZo#1?w-IBWGjDxVe=Qgv#iX<7J5n|v*vFj25^glIMXAXL zA1;C=OP7hhB^^jRQ5hNY(^A%iq9z*@g-1HdiYsa=m^mwxuY1x>)?4aLykX?{HUj_v N002ovPDHLkV1nzUFpdBK literal 0 HcmV?d00001 diff --git a/docs/kicad/pcm_keyswitch_library.png b/docs/kicad/pcm_keyswitch_library.png new file mode 100644 index 0000000000000000000000000000000000000000..07b884456426100eb6c8630db6b1a2d9697f44ae GIT binary patch literal 52562 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 J)wqUc{tXBq3DE!m literal 0 HcmV?d00001 diff --git a/edg/vendor_parts/TactileSwitches.py b/edg/vendor_parts/TactileSwitches.py index 6acdff942..b9394b4b9 100644 --- a/edg/vendor_parts/TactileSwitches.py +++ b/edg/vendor_parts/TactileSwitches.py @@ -40,11 +40,8 @@ def contents(self) -> None: class KailhSocket(MechanicalKeyswitch, FootprintBlock): """Kailh mechanical keyboard hotswap socket. - Requires an external library, Keyswitch Kicad Library, can be installed from the - KiCad Plugin and Content Manager, or from GitHub https://github.com/perigoso/keyswitch-kicad-library - Even after the content manager install, it must also be manually added to the footprint table: - Name: Switch_Keyboard_Hotswap_Kailh - Location: ${KICAD6_3RD_PARTY}/footprints/com_github_perigoso_keyswitch-kicad-library/Switch_Keyboard_Hotswap_Kailh.pretty + Requires an external library, Keyswitch Kicad Library, available on the KiCad Plugin and Content Manager (PCM). + This footprint uses the path when installed via the PCM. """ @override @@ -53,7 +50,7 @@ def contents(self) -> None: self.footprint( "SW", - "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX", + "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX", { "1": self.sw, "2": self.com, diff --git a/examples/test_blinky.py b/examples/test_blinky.py index 2ed207a66..49b47daf3 100644 --- a/examples/test_blinky.py +++ b/examples/test_blinky.py @@ -199,7 +199,7 @@ def refinements(self) -> Refinements: class_refinements=[ (IoController, Stm32f103), (Switch, KailhSocket), - (Neopixel, Sk6812Mini_E), + (Neopixel, Ws2812c_2020), ], ) @@ -247,7 +247,7 @@ def refinements(self) -> Refinements: class_refinements=[ (IoController, Stm32f103), (Switch, KailhSocket), - (Neopixel, Sk6812Mini_E), + (Neopixel, Ws2812c_2020), ], ) @@ -295,7 +295,7 @@ def refinements(self) -> Refinements: class_refinements=[ (IoController, Stm32f103), (Switch, KailhSocket), - (Neopixel, Sk6812Mini_E), + (Neopixel, Ws2812c_2020), ], instance_values=[ ( diff --git a/getting-started.md b/getting-started.md index aa7411bb6..eeea70795 100644 --- a/getting-started.md +++ b/getting-started.md @@ -536,7 +536,7 @@ This is supported through **mixins**. class_refinements=[ (IoController, Stm32f103), (Switch, KailhSocket), -+ (Neopixel, Sk6812Mini_E), ++ (Neopixel, Ws2812c_2020), ], ) ``` @@ -551,7 +551,8 @@ We have also added a buffer (`L74Ahct1g125`) to shift the 3.3v logic level of th The RGBs datasheet defines their input thresholds as incompatible with 3.3v and this will generate ERC errors without the buffer. Go ahead and try it! -We also add a refinement to use the SK6812-Mini-E, a through-board LED used on mechanical keyboards. +We also add a refinement to use the `Ws2812c_2020`, an 0808-size addressable RGB LED. +The `SK6812-Mini-E`, a through-board addressable LED commonly used on mechanical keyboards, is also part of the HDL library, but requires the [examples footprint library](examples/edg.pretty). ## Implicit Connections diff --git a/getting_started_hierarchy_layout.md b/getting_started_hierarchy_layout.md index e69de29bb..c21f1cc5e 100644 --- a/getting_started_hierarchy_layout.md +++ b/getting_started_hierarchy_layout.md @@ -0,0 +1,40 @@ +# Hierarchical Layout Tutorial + +Hierarchical layout tips and tricks, using the macropad circuit from the [introductory tutorial](getting-started.md) as an example. + + +## Requirements + +The example uses the Keyswitch Kicad Library, available on the KiCad Plugin and Content Manager. + +![Keyswitch](docs/kicad/pcm_keyswitch_library.png) + +For hierarchical loading and replication, you have two options: + +- Use KiCad 10+ and the native design blocks feature. + - This tutorial covers hierarchical replication, but hierarchical loading is not covered. + - The design blocks flow is heavyweight (requires local library creation) and (at least for netlist driven flows, like this one) requires you to group footprints within a block manually. +- Use the Sublayout plugin (KiCad 8+), also available on the KiCad Plugin and Content Manager. + ![Sublayout](docs/kicad/pcm_sublayout.png) + - This was designed to work with netlist-based flows and automatically detects grouping based on hierarchy data in the netlist. + - This works with KiCad 10+, but zone replication is broken. +- Replicate Layout, Save/Restore Layout, and HierarchicalPCB will **NOT work**. These require and validate against schematic files, which are not generated in this HDL flow. + + +## Netlist Import + +1. Start the PCB Editor (standalone) + + ![PCB Editor](docs/kicad/app_pcb_editor.png) +2. Open Import Netlist from the toolbar: + + ![pcb_netlist.png](docs/kicad/pcb_netlist.png) + > If you launched the PCB Editor from a KiCad project, this will not be on the toolbar (you will have "Update PCB from Schematic" instead). + > You can still access it from the menu: File > Import > Netlist... + +3. Select the generated netlist file, likely `BlinkyExample/BlinkyExample.net` in whereever you ran your HDL script. + + +> In KiCad 10, uncheck "Group footprints based on symbol group". +> This ignores hierarchical data in the netlist and removes footprint grouping. + From 46e225fcaa9d6ddcde5c29d83555af9f2225648d Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 01:21:31 -0700 Subject: [PATCH 25/41] wip --- docs/kicad/pcb_initial.png | Bin 0 -> 55966 bytes docs/kicad/pcb_netlist_dialog.png | Bin 0 -> 25290 bytes docs/kicad/pcb_switchcell.png | Bin 0 -> 17648 bytes .../DeskController/DeskController.net.ref | 12 +- .../JacdacKeyswitch/JacdacKeyswitch.net.ref | 2 +- .../JacdacKeyswitch/JacdacKeyswitch.svgpcb.js | 76 ++++----- examples/Keyboard/Keyboard.net.ref | 24 +-- examples/PcbBot/PcbBot.net.ref | 2 +- examples/PcbBot/PcbBot.svgpcb.js | 146 +++++++++--------- .../TestBlinkyImplicit.net.ref | 120 +++++++------- .../TestBlinkyImplicit.svgpcb.js | 18 +-- .../TestBlinkyPinned/TestBlinkyPinned.net.ref | 120 +++++++------- .../TestBlinkyPinned.svgpcb.js | 18 +-- .../TestBlinkyRegulated.net.ref | 12 +- examples/TestBlinkyRgb/TestBlinkyRgb.net.ref | 120 +++++++------- .../TestBlinkyRgb/TestBlinkyRgb.svgpcb.js | 18 +-- .../TestBlinkySwitchMatrixRefined.net.ref | 12 +- getting_started_hierarchy_layout.md | 36 ++++- 18 files changed, 382 insertions(+), 354 deletions(-) create mode 100644 docs/kicad/pcb_initial.png create mode 100644 docs/kicad/pcb_netlist_dialog.png create mode 100644 docs/kicad/pcb_switchcell.png diff --git a/docs/kicad/pcb_initial.png b/docs/kicad/pcb_initial.png new file mode 100644 index 0000000000000000000000000000000000000000..e9b5d484d8325a1e223d6267696358e64950ce96 GIT binary patch literal 55966 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
X)yKm6=xVSz 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 a=GN_sBp@Y9l@@vk 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 z\yTTRjy$YW6wuKS3Fr#@WWCYxNCre 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 z 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 X@l=i9?E~Iqa^j|r!L>pyoACb!M_D~` literal 0 HcmV?d00001 diff --git a/examples/DeskController/DeskController.net.ref b/examples/DeskController/DeskController.net.ref index cbb6f5660..8972bfabe 100644 --- a/examples/DeskController/DeskController.net.ref +++ b/examples/DeskController/DeskController.net.ref @@ -266,7 +266,7 @@ (tstamps "00640064")) (comp (ref "DSW1") (value "sw.sw[0,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,0].sw")) @@ -290,7 +290,7 @@ (tstamps "00650065")) (comp (ref "DSW2") (value "sw.sw[1,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,0].sw")) @@ -314,7 +314,7 @@ (tstamps "00650065")) (comp (ref "DSW3") (value "sw.sw[0,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,1].sw")) @@ -338,7 +338,7 @@ (tstamps "00650065")) (comp (ref "DSW4") (value "sw.sw[1,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,1].sw")) @@ -362,7 +362,7 @@ (tstamps "00650065")) (comp (ref "DSW5") (value "sw.sw[0,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,2].sw")) @@ -386,7 +386,7 @@ (tstamps "00650065")) (comp (ref "DSW6") (value "sw.sw[1,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,2].sw")) diff --git a/examples/JacdacKeyswitch/JacdacKeyswitch.net.ref b/examples/JacdacKeyswitch/JacdacKeyswitch.net.ref index a8b6abaf4..2d63b49ea 100644 --- a/examples/JacdacKeyswitch/JacdacKeyswitch.net.ref +++ b/examples/JacdacKeyswitch/JacdacKeyswitch.net.ref @@ -326,7 +326,7 @@ (tstamps "02ae014f")) (comp (ref "SW1") (value "sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "")) (property (name "Sheetfile") (value "")) (property (name "edg_path") (value "sw.package")) diff --git a/examples/JacdacKeyswitch/JacdacKeyswitch.svgpcb.js b/examples/JacdacKeyswitch/JacdacKeyswitch.svgpcb.js index ac8ed410d..ed4c432b4 100644 --- a/examples/JacdacKeyswitch/JacdacKeyswitch.svgpcb.js +++ b/examples/JacdacKeyswitch/JacdacKeyswitch.svgpcb.js @@ -2,187 +2,187 @@ const board = new PCB(); // jlc_th.th1 const H1 = board.add(JlcToolingHole_1_152mm, { - translate: pt(0.862, 1.038), rotate: 0, + translate: pt(0.575, 0.968), rotate: 0, id: 'H1' }) // jlc_th.th2 const H2 = board.add(JlcToolingHole_1_152mm, { - translate: pt(0.902, 1.038), rotate: 0, + translate: pt(0.614, 0.968), rotate: 0, id: 'H2' }) // jlc_th.th3 const H3 = board.add(JlcToolingHole_1_152mm, { - translate: pt(0.862, 1.078), rotate: 0, + translate: pt(0.575, 1.007), rotate: 0, id: 'H3' }) // edge.conn const EC1 = board.add(JD_PEC_02_Prerouted_recessed, { - translate: pt(0.113, 0.883), rotate: 0, + translate: pt(1.090, 0.194), rotate: 0, id: 'EC1' }) // edge.status_led.package const D1 = board.add(LED_0603_1608Metric, { - translate: pt(0.058, 0.718), rotate: 0, + translate: pt(1.036, 0.029), rotate: 0, id: 'D1' }) // edge.status_led.res const R1 = board.add(R_0603_1608Metric, { - translate: pt(0.058, 0.815), rotate: 0, + translate: pt(1.035, 0.126), rotate: 0, id: 'R1' }) // edge.tvs_jd_pwr.diode const D2 = board.add(D_0402_1005Metric, { - translate: pt(0.193, 0.805), rotate: 0, + translate: pt(1.170, 0.116), rotate: 0, id: 'D2' }) // edge.tvs_jd_data.diode const D3 = board.add(D_0402_1005Metric, { - translate: pt(0.037, 0.902), rotate: 0, + translate: pt(1.014, 0.213), rotate: 0, id: 'D3' }) // jd_mh1 const MH1 = board.add(jacdac_hole_DATA_notched_MH1, { - translate: pt(1.020, 1.038), rotate: 0, + translate: pt(0.850, 0.968), rotate: 0, id: 'MH1' }) // jd_mh2 const MH2 = board.add(jacdac_hole_GND_MH2, { - translate: pt(1.059, 1.038), rotate: 0, + translate: pt(0.890, 0.968), rotate: 0, id: 'MH2' }) // jd_mh3 const MH3 = board.add(jacdac_hole_PWR_MH3, { - translate: pt(1.098, 1.038), rotate: 0, + translate: pt(0.929, 0.968), rotate: 0, id: 'MH3' }) // jd_mh4 const MH4 = board.add(jacdac_hole_GND_MH4, { - translate: pt(1.138, 1.038), rotate: 0, + translate: pt(0.969, 0.968), rotate: 0, id: 'MH4' }) // edge2.conn const EC2 = board.add(JD_PEC_02_Prerouted_recessed, { - translate: pt(0.460, 0.883), rotate: 0, + translate: pt(0.113, 0.813), rotate: 0, id: 'EC2' }) // edge2.status_led.package const D4 = board.add(LED_0603_1608Metric, { - translate: pt(0.406, 0.718), rotate: 0, + translate: pt(0.058, 0.648), rotate: 0, id: 'D4' }) // edge2.status_led.res const R2 = board.add(R_0603_1608Metric, { - translate: pt(0.406, 0.815), rotate: 0, + translate: pt(0.058, 0.745), rotate: 0, id: 'R2' }) // edge2.tvs_jd_pwr.diode const D5 = board.add(D_0402_1005Metric, { - translate: pt(0.540, 0.805), rotate: 0, + translate: pt(0.193, 0.735), rotate: 0, id: 'D5' }) // edge2.tvs_jd_data.diode const D6 = board.add(D_0402_1005Metric, { - translate: pt(0.384, 0.902), rotate: 0, + translate: pt(0.037, 0.831), rotate: 0, id: 'D6' }) // tp_gnd.tp const TP1 = board.add(TestPoint_Keystone_5015_Micro_Minature, { - translate: pt(0.085, 1.091), rotate: 0, + translate: pt(1.213, 0.672), rotate: 0, id: 'TP1' }) // tp_jd_pwr.tp const TP2 = board.add(TestPoint_Keystone_5015_Micro_Minature, { - translate: pt(0.372, 1.091), rotate: 0, + translate: pt(0.085, 1.021), rotate: 0, id: 'TP2' }) // reg_3v3.ic const U1 = board.add(SOT_23_5, { - translate: pt(0.775, 0.756), rotate: 0, + translate: pt(0.428, 0.686), rotate: 0, id: 'U1' }) // reg_3v3.in_cap.cap const C1 = board.add(C_0603_1608Metric, { - translate: pt(0.753, 0.891), rotate: 0, + translate: pt(0.406, 0.821), rotate: 0, id: 'C1' }) // reg_3v3.out_cap.cap const C2 = board.add(C_0603_1608Metric, { - translate: pt(0.909, 0.891), rotate: 0, + translate: pt(0.561, 0.821), rotate: 0, id: 'C2' }) // tp_3v3.tp const TP3 = board.add(TestPoint_Keystone_5015_Micro_Minature, { - translate: pt(0.659, 1.091), rotate: 0, + translate: pt(0.372, 1.021), rotate: 0, id: 'TP3' }) // mcu.ic const U2 = board.add(QFN_28_4x4mm_P0_5mm, { - translate: pt(0.836, 0.104), rotate: 0, + translate: pt(0.104, 0.104), rotate: 0, id: 'U2' }) // mcu.pwr_cap0.cap const C3 = board.add(C_0805_2012Metric, { - translate: pt(1.114, 0.285), rotate: 0, + translate: pt(0.382, 0.285), rotate: 0, id: 'C3' }) // mcu.pwr_cap1.cap const C4 = board.add(C_0603_1608Metric, { - translate: pt(0.791, 0.472), rotate: 0, + translate: pt(0.058, 0.472), rotate: 0, id: 'C4' }) // mcu.swd.conn const J1 = board.add(Tag_Connect_TC2030_IDC_NL_2x03_P1_27mm_Vertical, { - translate: pt(0.870, 0.325), rotate: 0, + translate: pt(0.138, 0.325), rotate: 0, id: 'J1' }) // sw.package const SW1 = board.add(SW_Hotswap_Kailh_MX, { - translate: pt(0.307, 0.285), rotate: 0, + translate: pt(0.732, 0.968), rotate: 0, id: 'SW1' }) // rgb.package const D7 = board.add(LED_LiteOn_LTST_C19HE1WT, { - translate: pt(1.126, 0.744), rotate: 0, + translate: pt(0.779, 0.674), rotate: 0, id: 'D7' }) // rgb.red_res const R3 = board.add(R_0603_1608Metric, { - translate: pt(1.265, 0.718), rotate: 0, + translate: pt(0.918, 0.648), rotate: 0, id: 'R3' }) // rgb.green_res const R4 = board.add(R_0603_1608Metric, { - translate: pt(1.143, 0.867), rotate: 0, + translate: pt(0.796, 0.797), rotate: 0, id: 'R4' }) // rgb.blue_res const R5 = board.add(R_0603_1608Metric, { - translate: pt(1.299, 0.867), rotate: 0, + translate: pt(0.952, 0.797), rotate: 0, id: 'R5' }) // jd_if.ferrite const FB1 = board.add(L_0603_1608Metric, { - translate: pt(1.357, 0.143), rotate: 0, + translate: pt(0.625, 0.143), rotate: 0, id: 'FB1' }) // jd_if.rc.r const R6 = board.add(R_0603_1608Metric, { - translate: pt(1.513, 0.143), rotate: 0, + translate: pt(0.781, 0.143), rotate: 0, id: 'R6' }) // jd_if.rc.c const C5 = board.add(C_0603_1608Metric, { - translate: pt(1.357, 0.240), rotate: 0, + translate: pt(0.625, 0.240), rotate: 0, id: 'C5' }) // jd_if.clamp_hi const D8 = board.add(D_SOD_323, { - translate: pt(1.363, 0.037), rotate: 0, + translate: pt(0.630, 0.037), rotate: 0, id: 'D8' }) // jd_if.clamp_lo const D9 = board.add(D_SOD_323, { - translate: pt(1.528, 0.037), rotate: 0, + translate: pt(0.796, 0.037), rotate: 0, id: 'D9' }) @@ -210,7 +210,7 @@ board.setNetlist([ ]) const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(1.709448818897638, 1.2625984251968505); +const limit1 = pt(1.415748031496063, 1.19251968503937); const xMin = Math.min(limit0[0], limit1[0]); const xMax = Math.max(limit0[0], limit1[0]); const yMin = Math.min(limit0[1], limit1[1]); diff --git a/examples/Keyboard/Keyboard.net.ref b/examples/Keyboard/Keyboard.net.ref index 30a51b3a1..fb875de81 100644 --- a/examples/Keyboard/Keyboard.net.ref +++ b/examples/Keyboard/Keyboard.net.ref @@ -218,7 +218,7 @@ (tstamps "0296014b")) (comp (ref "SW1") (value "sw.sw[0,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,0].sw")) @@ -266,7 +266,7 @@ (tstamps "025e0135")) (comp (ref "SW2") (value "sw.sw[1,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,0].sw")) @@ -314,7 +314,7 @@ (tstamps "025e0135")) (comp (ref "SW3") (value "sw.sw[2,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[2,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,0].sw")) @@ -362,7 +362,7 @@ (tstamps "025e0135")) (comp (ref "SW4") (value "sw.sw[0,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,1].sw")) @@ -410,7 +410,7 @@ (tstamps "025e0135")) (comp (ref "SW5") (value "sw.sw[1,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,1].sw")) @@ -458,7 +458,7 @@ (tstamps "025e0135")) (comp (ref "SW6") (value "sw.sw[2,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[2,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,1].sw")) @@ -506,7 +506,7 @@ (tstamps "025e0135")) (comp (ref "SW7") (value "sw.sw[0,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,2].sw")) @@ -554,7 +554,7 @@ (tstamps "025e0135")) (comp (ref "SW8") (value "sw.sw[1,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,2].sw")) @@ -602,7 +602,7 @@ (tstamps "025e0135")) (comp (ref "SW9") (value "sw.sw[2,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[2,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,2].sw")) @@ -650,7 +650,7 @@ (tstamps "025e0135")) (comp (ref "SW10") (value "sw.sw[0,3].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,3]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,3].sw")) @@ -698,7 +698,7 @@ (tstamps "025e0135")) (comp (ref "SW11") (value "sw.sw[1,3].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,3]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,3].sw")) @@ -746,7 +746,7 @@ (tstamps "025e0135")) (comp (ref "SW12") (value "sw.sw[2,3].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[2,3]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[2,3].sw")) diff --git a/examples/PcbBot/PcbBot.net.ref b/examples/PcbBot/PcbBot.net.ref index 4c0bd7ffd..c6b41329e 100644 --- a/examples/PcbBot/PcbBot.net.ref +++ b/examples/PcbBot/PcbBot.net.ref @@ -1286,7 +1286,7 @@ (tstamps "175c0440")) (comp (ref "SW3") (value "switch") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "")) (property (name "Sheetfile") (value "")) (property (name "edg_path") (value "switch.package")) diff --git a/examples/PcbBot/PcbBot.svgpcb.js b/examples/PcbBot/PcbBot.svgpcb.js index c91681e02..3deed6500 100644 --- a/examples/PcbBot/PcbBot.svgpcb.js +++ b/examples/PcbBot/PcbBot.svgpcb.js @@ -2,162 +2,162 @@ const board = new PCB(); // jlc_th.th1 const H1 = board.add(JlcToolingHole_1_152mm, { - translate: pt(0.191, 3.717), rotate: 0, + translate: pt(3.848, 3.301), rotate: 0, id: 'H1' }) // jlc_th.th2 const H2 = board.add(JlcToolingHole_1_152mm, { - translate: pt(0.230, 3.717), rotate: 0, + translate: pt(3.887, 3.301), rotate: 0, id: 'H2' }) // jlc_th.th3 const H3 = board.add(JlcToolingHole_1_152mm, { - translate: pt(0.191, 3.757), rotate: 0, + translate: pt(3.848, 3.341), rotate: 0, id: 'H3' }) // usb.conn const J1 = board.add(USB_C_Receptacle_XKB_U262_16XN_4BVC11, { - translate: pt(3.766, 1.905), rotate: 0, + translate: pt(3.034, 1.905), rotate: 0, id: 'J1' }) // usb.cc_pull.cc1 const R1 = board.add(R_0603_1608Metric, { - translate: pt(3.615, 2.160), rotate: 0, + translate: pt(2.883, 2.160), rotate: 0, id: 'R1' }) // usb.cc_pull.cc2 const R2 = board.add(R_0603_1608Metric, { - translate: pt(3.771, 2.160), rotate: 0, + translate: pt(3.039, 2.160), rotate: 0, id: 'R2' }) // batt.conn const J2 = board.add(JST_PH_B2B_PH_K_1x02_P2_00mm_Vertical, { - translate: pt(1.674, 3.498), rotate: 0, + translate: pt(0.487, 3.431), rotate: 0, id: 'J2' }) // tp_gnd.tp const TP1 = board.add(TestPoint_TE_RCT_0805, { - translate: pt(3.914, 3.406), rotate: 0, + translate: pt(2.728, 3.339), rotate: 0, id: 'TP1' }) // fuse.fuse const F1 = board.add(R_1206_3216Metric, { - translate: pt(3.640, 3.413), rotate: 0, + translate: pt(2.454, 3.345), rotate: 0, id: 'F1' }) // gate.pwr_gate.pull_res const R3 = board.add(R_0603_1608Metric, { - translate: pt(2.972, 2.206), rotate: 0, + translate: pt(2.239, 2.206), rotate: 0, id: 'R3' }) // gate.pwr_gate.pwr_fet const Q1 = board.add(SOT_23, { - translate: pt(3.363, 1.807), rotate: 0, + translate: pt(2.631, 1.807), rotate: 0, id: 'Q1' }) // gate.pwr_gate.amp_res const R4 = board.add(R_0603_1608Metric, { - translate: pt(3.128, 2.206), rotate: 0, + translate: pt(2.395, 2.206), rotate: 0, id: 'R4' }) // gate.pwr_gate.amp_fet const Q2 = board.add(SOT_23, { - translate: pt(2.989, 2.071), rotate: 0, + translate: pt(2.257, 2.071), rotate: 0, id: 'Q2' }) // gate.pwr_gate.ctl_diode const D1 = board.add(D_SOD_323, { - translate: pt(3.167, 2.041), rotate: 0, + translate: pt(2.435, 2.041), rotate: 0, id: 'D1' }) // gate.pwr_gate.btn_diode const D2 = board.add(D_SOD_323, { - translate: pt(3.333, 2.041), rotate: 0, + translate: pt(2.601, 2.041), rotate: 0, id: 'D2' }) // gate.btn.package const SW1 = board.add(SW_SPST_SKQG_WithoutStem, { - translate: pt(3.081, 1.852), rotate: 0, + translate: pt(2.348, 1.852), rotate: 0, id: 'SW1' }) // prot_batt.diode const D3 = board.add(D_SMA, { - translate: pt(3.294, 3.437), rotate: 0, + translate: pt(2.108, 3.370), rotate: 0, id: 'D3' }) // tp_batt.tp const TP2 = board.add(TestPoint_TE_RCT_0805, { - translate: pt(4.165, 3.406), rotate: 0, + translate: pt(2.978, 3.339), rotate: 0, id: 'TP2' }) // pwr_or.pdr const R5 = board.add(R_0603_1608Metric, { - translate: pt(3.977, 3.044), rotate: 0, + translate: pt(2.681, 3.044), rotate: 0, id: 'R5' }) // pwr_or.diode const D4 = board.add(D_SOD_323, { - translate: pt(3.816, 3.053), rotate: 0, + translate: pt(2.521, 3.053), rotate: 0, id: 'D4' }) // pwr_or.fet const Q3 = board.add(SOT_23, { - translate: pt(3.828, 2.909), rotate: 0, + translate: pt(2.533, 2.909), rotate: 0, id: 'Q3' }) // reg_3v3.ic const U1 = board.add(SOT_223_3_TabPin2, { - translate: pt(1.004, 2.984), rotate: 0, + translate: pt(4.365, 1.882), rotate: 0, id: 'U1' }) // reg_3v3.in_cap.cap const C1 = board.add(C_0603_1608Metric, { - translate: pt(1.062, 3.194), rotate: 0, + translate: pt(4.424, 2.092), rotate: 0, id: 'C1' }) // reg_3v3.out_cap.cap const C2 = board.add(C_0805_2012Metric, { - translate: pt(0.898, 3.204), rotate: 0, + translate: pt(4.259, 2.102), rotate: 0, id: 'C2' }) // prot_3v3.diode const D5 = board.add(D_SOD_323, { - translate: pt(4.412, 3.406), rotate: 0, + translate: pt(3.226, 3.339), rotate: 0, id: 'D5' }) // tp_3v3.tp const TP3 = board.add(TestPoint_TE_RCT_0805, { - translate: pt(4.659, 3.406), rotate: 0, + translate: pt(3.473, 3.339), rotate: 0, id: 'TP3' }) // charger.ic const U2 = board.add(SOT_23_5, { - translate: pt(3.381, 2.909), rotate: 0, + translate: pt(2.085, 2.909), rotate: 0, id: 'U2' }) // charger.vdd_cap.cap const C3 = board.add(C_0805_2012Metric, { - translate: pt(3.568, 2.881), rotate: 0, + translate: pt(2.272, 2.881), rotate: 0, id: 'C3' }) // charger.vbat_cap.cap const C4 = board.add(C_0805_2012Metric, { - translate: pt(3.367, 3.054), rotate: 0, + translate: pt(2.072, 3.054), rotate: 0, id: 'C4' }) // charger.prog_res.res const R6 = board.add(R_0603_1608Metric, { - translate: pt(3.531, 3.044), rotate: 0, + translate: pt(2.236, 3.044), rotate: 0, id: 'R6' }) // charge_led.package const D6 = board.add(LED_0603_1608Metric, { - translate: pt(2.276, 3.397), rotate: 0, + translate: pt(1.089, 3.330), rotate: 0, id: 'D6' }) // charge_led.res const R7 = board.add(R_0603_1608Metric, { - translate: pt(2.276, 3.494), rotate: 0, + translate: pt(1.089, 3.427), rotate: 0, id: 'R7' }) // mcu.prog.conn @@ -197,17 +197,17 @@ const C7 = board.add(C_0603_1608Metric, { }) // usb_esd const U4 = board.add(SOT_23, { - translate: pt(0.076, 3.784), rotate: 0, + translate: pt(3.733, 3.368), rotate: 0, id: 'U4' }) // led.package const D7 = board.add(LED_0603_1608Metric, { - translate: pt(2.511, 3.397), rotate: 0, + translate: pt(1.324, 3.330), rotate: 0, id: 'D7' }) // led.res const R9 = board.add(R_0603_1608Metric, { - translate: pt(2.510, 3.494), rotate: 0, + translate: pt(1.324, 3.427), rotate: 0, id: 'R9' }) // tof.elt[0].conn @@ -232,87 +232,87 @@ const J7 = board.add(PinSocket_1x06_P2_54mm_Vertical, { }) // i2c_pull.scl_res.res const R10 = board.add(R_0603_1608Metric, { - translate: pt(2.745, 3.397), rotate: 0, + translate: pt(1.559, 3.330), rotate: 0, id: 'R10' }) // i2c_pull.sda_res.res const R11 = board.add(R_0603_1608Metric, { - translate: pt(2.745, 3.494), rotate: 0, + translate: pt(1.559, 3.427), rotate: 0, id: 'R11' }) // i2c_tp.tp_scl.tp const TP4 = board.add(TestPoint_TE_RCT_0805, { - translate: pt(2.033, 3.406), rotate: 0, + translate: pt(0.846, 3.339), rotate: 0, id: 'TP4' }) // i2c_tp.tp_sda.tp const TP5 = board.add(TestPoint_TE_RCT_0805, { - translate: pt(2.033, 3.520), rotate: 0, + translate: pt(0.846, 3.453), rotate: 0, id: 'TP5' }) // imu.ic const U5 = board.add(Bosch_LGA_14_3x2_5mm_P0_5mm, { - translate: pt(1.259, 3.431), rotate: 0, + translate: pt(0.073, 3.364), rotate: 0, id: 'U5' }) // imu.vdd_cap.cap const C8 = board.add(C_0603_1608Metric, { - translate: pt(1.245, 3.563), rotate: 0, + translate: pt(0.058, 3.495), rotate: 0, id: 'C8' }) // imu.vddio_cap.cap const C9 = board.add(C_0603_1608Metric, { - translate: pt(1.401, 3.563), rotate: 0, + translate: pt(0.214, 3.495), rotate: 0, id: 'C9' }) // mag.ic const U6 = board.add(LGA_16_3x3mm_P0_5mm, { - translate: pt(4.222, 2.911), rotate: 0, + translate: pt(2.927, 2.911), rotate: 0, id: 'U6' }) // mag.vdd_cap.cap const C10 = board.add(C_0603_1608Metric, { - translate: pt(4.211, 3.048), rotate: 0, + translate: pt(2.916, 3.048), rotate: 0, id: 'C10' }) // mag.set_cap const C11 = board.add(C_0603_1608Metric, { - translate: pt(4.367, 3.048), rotate: 0, + translate: pt(3.072, 3.048), rotate: 0, id: 'C11' }) // mag.c1.cap const C12 = board.add(C_0805_2012Metric, { - translate: pt(4.397, 2.881), rotate: 0, + translate: pt(3.102, 2.881), rotate: 0, id: 'C12' }) // expander.ic const U7 = board.add(TSSOP_16_4_4x5mm_P0_65mm, { - translate: pt(2.486, 2.951), rotate: 0, + translate: pt(1.191, 2.951), rotate: 0, id: 'U7' }) // expander.vdd_cap.cap const C13 = board.add(C_0603_1608Metric, { - translate: pt(2.393, 3.127), rotate: 0, + translate: pt(1.098, 3.127), rotate: 0, id: 'C13' }) // rgb.package const D8 = board.add(LED_D5_0mm_4_RGB_Staggered_Pins, { - translate: pt(2.796, 3.000), rotate: 0, + translate: pt(1.501, 3.000), rotate: 0, id: 'D8' }) // rgb.red_res const R12 = board.add(R_0603_1608Metric, { - translate: pt(3.124, 2.871), rotate: 0, + translate: pt(1.828, 2.871), rotate: 0, id: 'R12' }) // rgb.green_res const R13 = board.add(R_0603_1608Metric, { - translate: pt(3.124, 2.968), rotate: 0, + translate: pt(1.828, 2.968), rotate: 0, id: 'R13' }) // rgb.blue_res const R14 = board.add(R_0603_1608Metric, { - translate: pt(3.124, 3.065), rotate: 0, + translate: pt(1.828, 3.065), rotate: 0, id: 'R14' }) // oled.device.conn @@ -362,32 +362,32 @@ const C19 = board.add(C_0805_2012Metric, { }) // batt_sense.div.top_res const R16 = board.add(R_0603_1608Metric, { - translate: pt(2.980, 3.397), rotate: 0, + translate: pt(1.793, 3.330), rotate: 0, id: 'R16' }) // batt_sense.div.bottom_res const R17 = board.add(R_0603_1608Metric, { - translate: pt(2.980, 3.494), rotate: 0, + translate: pt(1.793, 3.427), rotate: 0, id: 'R17' }) // servo[0].conn const J9 = board.add(PinHeader_1x03_P2_54mm_Vertical, { - translate: pt(1.366, 3.112), rotate: 0, + translate: pt(0.071, 3.112), rotate: 0, id: 'J9' }) // servo[1].conn const J10 = board.add(PinHeader_1x03_P2_54mm_Vertical, { - translate: pt(1.626, 3.112), rotate: 0, + translate: pt(0.331, 3.112), rotate: 0, id: 'J10' }) // servo[2].conn const J11 = board.add(PinHeader_1x03_P2_54mm_Vertical, { - translate: pt(1.886, 3.112), rotate: 0, + translate: pt(0.591, 3.112), rotate: 0, id: 'J11' }) // servo[3].conn const J12 = board.add(PinHeader_1x03_P2_54mm_Vertical, { - translate: pt(2.146, 3.112), rotate: 0, + translate: pt(0.850, 3.112), rotate: 0, id: 'J12' }) // npx.led[0] @@ -472,72 +472,72 @@ const D24 = board.add(LED_WS2812B_PLCC4_5_0x5_0mm_P3_2mm, { }) // npx_key.device const D25 = board.add(LED_SK6812MINI_E, { - translate: pt(0.925, 3.433), rotate: 0, + translate: pt(4.212, 2.907), rotate: 0, id: 'D25' }) // npx_key.cap.cap const C20 = board.add(C_0603_1608Metric, { - translate: pt(0.839, 3.567), rotate: 0, + translate: pt(4.126, 3.041), rotate: 0, id: 'C20' }) // reg_2v5.ic const U9 = board.add(SOT_23, { - translate: pt(0.076, 3.435), rotate: 0, + translate: pt(3.363, 2.909), rotate: 0, id: 'U9' }) // reg_2v5.in_cap.cap const C21 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 3.570), rotate: 0, + translate: pt(3.345, 3.044), rotate: 0, id: 'C21' }) // reg_2v5.out_cap.cap const C22 = board.add(C_0603_1608Metric, { - translate: pt(0.214, 3.570), rotate: 0, + translate: pt(3.501, 3.044), rotate: 0, id: 'C22' }) // reg_1v2.ic const U10 = board.add(SOT_23, { - translate: pt(0.466, 3.435), rotate: 0, + translate: pt(3.753, 2.909), rotate: 0, id: 'U10' }) // reg_1v2.in_cap.cap const C23 = board.add(C_0603_1608Metric, { - translate: pt(0.449, 3.570), rotate: 0, + translate: pt(3.736, 3.044), rotate: 0, id: 'C23' }) // reg_1v2.out_cap.cap const C24 = board.add(C_0603_1608Metric, { - translate: pt(0.605, 3.570), rotate: 0, + translate: pt(3.892, 3.044), rotate: 0, id: 'C24' }) // cam.device.conn const J13 = board.add(Hirose_FH12_24S_0_5SH_1x24_1MP_P0_50mm_Horizontal, { - translate: pt(0.356, 3.035), rotate: 0, + translate: pt(3.718, 1.933), rotate: 0, id: 'J13' }) // cam.dovdd_cap.cap const C25 = board.add(C_0603_1608Metric, { - translate: pt(0.058, 3.222), rotate: 0, + translate: pt(3.420, 2.119), rotate: 0, id: 'C25' }) // cam.reset_cap.cap const C26 = board.add(C_0603_1608Metric, { - translate: pt(0.214, 3.222), rotate: 0, + translate: pt(3.576, 2.119), rotate: 0, id: 'C26' }) // cam.pclk_cap.cap const C27 = board.add(C_0603_1608Metric, { - translate: pt(0.370, 3.222), rotate: 0, + translate: pt(3.731, 2.119), rotate: 0, id: 'C27' }) // cam.reset_pull.res const R18 = board.add(R_0603_1608Metric, { - translate: pt(0.526, 3.222), rotate: 0, + translate: pt(3.887, 2.119), rotate: 0, id: 'R18' }) // switch.package const SW3 = board.add(SW_Hotswap_Kailh_MX, { - translate: pt(2.488, 2.026), rotate: 0, + translate: pt(4.005, 3.301), rotate: 0, id: 'SW3' }) @@ -639,7 +639,7 @@ board.setNetlist([ ]) const limit0 = pt(-0.07874015748031496, -0.07874015748031496); -const limit1 = pt(4.843700787401574, 3.8905511811023628); +const limit1 = pt(4.656692913385828, 3.642125984251969); const xMin = Math.min(limit0[0], limit1[0]); const xMax = Math.max(limit0[0], limit1[0]); const yMin = Math.min(limit0[1], limit1[1]); diff --git a/examples/TestBlinkyImplicit/TestBlinkyImplicit.net.ref b/examples/TestBlinkyImplicit/TestBlinkyImplicit.net.ref index 09562dc7a..5627e034e 100644 --- a/examples/TestBlinkyImplicit/TestBlinkyImplicit.net.ref +++ b/examples/TestBlinkyImplicit/TestBlinkyImplicit.net.ref @@ -242,7 +242,7 @@ (tstamps "0296014b")) (comp (ref "SW1") (value "sw.sw[0,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,0].sw")) @@ -266,21 +266,21 @@ (tstamps "00650065")) (comp (ref "D3") (value "sw.sw[0,0].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,0].npx.device")) (property (name "edg_short_path") (value "sw.sw[0,0].npx.device")) (property (name "edg_refdes") (value "D3")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) (tstamps "08950271")) (comp (ref "C11") (value "sw.sw[0,0].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,0].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[0,0].npx.cap")) (property (name "edg_refdes") (value "C11")) @@ -290,7 +290,7 @@ (tstamps "025e0135")) (comp (ref "SW2") (value "sw.sw[1,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,0].sw")) @@ -314,21 +314,21 @@ (tstamps "00650065")) (comp (ref "D5") (value "sw.sw[1,0].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,0].npx.device")) (property (name "edg_short_path") (value "sw.sw[1,0].npx.device")) (property (name "edg_refdes") (value "D5")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) (tstamps "08950271")) (comp (ref "C12") (value "sw.sw[1,0].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,0].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[1,0].npx.cap")) (property (name "edg_refdes") (value "C12")) @@ -338,7 +338,7 @@ (tstamps "025e0135")) (comp (ref "SW3") (value "sw.sw[0,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,1].sw")) @@ -362,21 +362,21 @@ (tstamps "00650065")) (comp (ref "D7") (value "sw.sw[0,1].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,1].npx.device")) (property (name "edg_short_path") (value "sw.sw[0,1].npx.device")) (property (name "edg_refdes") (value "D7")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) (tstamps "08950271")) (comp (ref "C13") (value "sw.sw[0,1].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,1].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[0,1].npx.cap")) (property (name "edg_refdes") (value "C13")) @@ -386,7 +386,7 @@ (tstamps "025e0135")) (comp (ref "SW4") (value "sw.sw[1,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,1].sw")) @@ -410,21 +410,21 @@ (tstamps "00650065")) (comp (ref "D9") (value "sw.sw[1,1].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,1].npx.device")) (property (name "edg_short_path") (value "sw.sw[1,1].npx.device")) (property (name "edg_refdes") (value "D9")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) (tstamps "08950271")) (comp (ref "C14") (value "sw.sw[1,1].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,1].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[1,1].npx.cap")) (property (name "edg_refdes") (value "C14")) @@ -434,7 +434,7 @@ (tstamps "025e0135")) (comp (ref "SW5") (value "sw.sw[0,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,2].sw")) @@ -458,21 +458,21 @@ (tstamps "00650065")) (comp (ref "D11") (value "sw.sw[0,2].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,2].npx.device")) (property (name "edg_short_path") (value "sw.sw[0,2].npx.device")) (property (name "edg_refdes") (value "D11")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) (tstamps "08950271")) (comp (ref "C15") (value "sw.sw[0,2].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,2].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[0,2].npx.cap")) (property (name "edg_refdes") (value "C15")) @@ -482,7 +482,7 @@ (tstamps "025e0135")) (comp (ref "SW6") (value "sw.sw[1,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,2].sw")) @@ -506,21 +506,21 @@ (tstamps "00650065")) (comp (ref "D13") (value "sw.sw[1,2].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,2].npx.device")) (property (name "edg_short_path") (value "sw.sw[1,2].npx.device")) (property (name "edg_refdes") (value "D13")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) (tstamps "08950271")) (comp (ref "C16") (value "sw.sw[1,2].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,2].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[1,2].npx.cap")) (property (name "edg_refdes") (value "C16")) @@ -560,17 +560,17 @@ (node (ref J1) (pin B9)) (node (ref U1) (pin 3)) (node (ref C1) (pin 1)) - (node (ref D3) (pin 1)) + (node (ref D3) (pin 4)) (node (ref C11) (pin 1)) - (node (ref D5) (pin 1)) + (node (ref D5) (pin 4)) (node (ref C12) (pin 1)) - (node (ref D7) (pin 1)) + (node (ref D7) (pin 4)) (node (ref C13) (pin 1)) - (node (ref D9) (pin 1)) + (node (ref D9) (pin 4)) (node (ref C14) (pin 1)) - (node (ref D11) (pin 1)) + (node (ref D11) (pin 4)) (node (ref C15) (pin 1)) - (node (ref D13) (pin 1)) + (node (ref D13) (pin 4)) (node (ref C16) (pin 1)) (node (ref U3) (pin 5)) (node (ref C17) (pin 1))) @@ -604,17 +604,17 @@ (node (ref J2) (pin 5)) (node (ref J2) (pin 9)) (node (ref R4) (pin 2)) - (node (ref D3) (pin 3)) + (node (ref D3) (pin 2)) (node (ref C11) (pin 2)) - (node (ref D5) (pin 3)) + (node (ref D5) (pin 2)) (node (ref C12) (pin 2)) - (node (ref D7) (pin 3)) + (node (ref D7) (pin 2)) (node (ref C13) (pin 2)) - (node (ref D9) (pin 3)) + (node (ref D9) (pin 2)) (node (ref C14) (pin 2)) - (node (ref D11) (pin 3)) + (node (ref D11) (pin 2)) (node (ref C15) (pin 2)) - (node (ref D13) (pin 3)) + (node (ref D13) (pin 2)) (node (ref C16) (pin 2)) (node (ref U3) (pin 1)) (node (ref U3) (pin 3)) @@ -700,28 +700,28 @@ (node (ref D1) (pin 1)) (node (ref R4) (pin 1))) (net (code 22) (name "sw.npx_din") - (node (ref D3) (pin 4)) + (node (ref D3) (pin 3)) (node (ref U3) (pin 4))) (net (code 23) (name "sw.npx_dout") - (node (ref D13) (pin 2))) + (node (ref D13) (pin 1))) (net (code 24) (name "sw.sw[0,0].npx_dout") - (node (ref D3) (pin 2)) - (node (ref D5) (pin 4))) + (node (ref D3) (pin 1)) + (node (ref D5) (pin 3))) (net (code 25) (name "sw.sw[0,0].sw.com") (node (ref SW1) (pin 2)) (node (ref D2) (pin 2))) (net (code 26) (name "sw.sw[1,0].npx_dout") - (node (ref D5) (pin 2)) - (node (ref D9) (pin 4))) + (node (ref D5) (pin 1)) + (node (ref D9) (pin 3))) (net (code 27) (name "sw.sw[1,0].sw.com") (node (ref SW2) (pin 2)) (node (ref D4) (pin 2))) (net (code 28) (name "sw.sw[0,1].npx_din") - (node (ref D7) (pin 4)) - (node (ref D9) (pin 2))) + (node (ref D7) (pin 3)) + (node (ref D9) (pin 1))) (net (code 29) (name "sw.sw[0,1].npx_dout") - (node (ref D7) (pin 2)) - (node (ref D11) (pin 4))) + (node (ref D7) (pin 1)) + (node (ref D11) (pin 3))) (net (code 30) (name "sw.sw[0,1].sw.com") (node (ref SW3) (pin 2)) (node (ref D6) (pin 2))) @@ -729,8 +729,8 @@ (node (ref SW4) (pin 2)) (node (ref D8) (pin 2))) (net (code 32) (name "sw.sw[0,2].npx_dout") - (node (ref D11) (pin 2)) - (node (ref D13) (pin 4))) + (node (ref D11) (pin 1)) + (node (ref D13) (pin 3))) (net (code 33) (name "sw.sw[0,2].sw.com") (node (ref SW5) (pin 2)) (node (ref D10) (pin 2))) diff --git a/examples/TestBlinkyImplicit/TestBlinkyImplicit.svgpcb.js b/examples/TestBlinkyImplicit/TestBlinkyImplicit.svgpcb.js index cf479b36c..c39727ed8 100644 --- a/examples/TestBlinkyImplicit/TestBlinkyImplicit.svgpcb.js +++ b/examples/TestBlinkyImplicit/TestBlinkyImplicit.svgpcb.js @@ -113,8 +113,8 @@ const C17 = board.add(C_0603_1608Metric, { }) board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "1"], ["C11", "1"], ["D5", "1"], ["C12", "1"], ["D7", "1"], ["C13", "1"], ["D9", "1"], ["C14", "1"], ["D11", "1"], ["C15", "1"], ["D13", "1"], ["C16", "1"], ["U3", "5"], ["C17", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"], ["D3", "3"], ["C11", "2"], ["D5", "3"], ["C12", "2"], ["D7", "3"], ["C13", "2"], ["D9", "3"], ["C14", "2"], ["D11", "3"], ["C15", "2"], ["D13", "3"], ["C16", "2"], ["U3", "1"], ["U3", "3"], ["C17", "2"]]}, + {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "4"], ["C11", "1"], ["D5", "4"], ["C12", "1"], ["D7", "4"], ["C13", "1"], ["D9", "4"], ["C14", "1"], ["D11", "4"], ["C15", "1"], ["D13", "4"], ["C16", "1"], ["U3", "5"], ["C17", "1"]]}, + {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"], ["D3", "2"], ["C11", "2"], ["D5", "2"], ["C12", "2"], ["D7", "2"], ["C13", "2"], ["D9", "2"], ["C14", "2"], ["D11", "2"], ["C15", "2"], ["D13", "2"], ["C16", "2"], ["U3", "1"], ["U3", "3"], ["C17", "2"]]}, {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "33"], ["R3", "2"]]}, {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "32"]]}, {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, @@ -134,17 +134,17 @@ board.setNetlist([ {name: "mcu.swd.swo", pads: [["J2", "6"]]}, {name: "led.signal", pads: [["U2", "10"], ["D1", "2"]]}, {name: "led.package.k", pads: [["D1", "1"], ["R4", "1"]]}, - {name: "sw.npx_din", pads: [["D3", "4"], ["U3", "4"]]}, - {name: "sw.npx_dout", pads: [["D13", "2"]]}, - {name: "sw.sw[0,0].npx_dout", pads: [["D3", "2"], ["D5", "4"]]}, + {name: "sw.npx_din", pads: [["D3", "3"], ["U3", "4"]]}, + {name: "sw.npx_dout", pads: [["D13", "1"]]}, + {name: "sw.sw[0,0].npx_dout", pads: [["D3", "1"], ["D5", "3"]]}, {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, - {name: "sw.sw[1,0].npx_dout", pads: [["D5", "2"], ["D9", "4"]]}, + {name: "sw.sw[1,0].npx_dout", pads: [["D5", "1"], ["D9", "3"]]}, {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D4", "2"]]}, - {name: "sw.sw[0,1].npx_din", pads: [["D7", "4"], ["D9", "2"]]}, - {name: "sw.sw[0,1].npx_dout", pads: [["D7", "2"], ["D11", "4"]]}, + {name: "sw.sw[0,1].npx_din", pads: [["D7", "3"], ["D9", "1"]]}, + {name: "sw.sw[0,1].npx_dout", pads: [["D7", "1"], ["D11", "3"]]}, {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D6", "2"]]}, {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D8", "2"]]}, - {name: "sw.sw[0,2].npx_dout", pads: [["D11", "2"], ["D13", "4"]]}, + {name: "sw.sw[0,2].npx_dout", pads: [["D11", "1"], ["D13", "3"]]}, {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D10", "2"]]}, {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D12", "2"]]}, {name: "npx_shift.input", pads: [["U2", "11"], ["U3", "2"]]} diff --git a/examples/TestBlinkyPinned/TestBlinkyPinned.net.ref b/examples/TestBlinkyPinned/TestBlinkyPinned.net.ref index 0a6d8dadc..2a8ffbe64 100644 --- a/examples/TestBlinkyPinned/TestBlinkyPinned.net.ref +++ b/examples/TestBlinkyPinned/TestBlinkyPinned.net.ref @@ -242,7 +242,7 @@ (tstamps "0296014b")) (comp (ref "SW1") (value "sw.sw[0,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,0].sw")) @@ -266,21 +266,21 @@ (tstamps "00650065")) (comp (ref "D3") (value "sw.sw[0,0].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,0].npx.device")) (property (name "edg_short_path") (value "sw.sw[0,0].npx.device")) (property (name "edg_refdes") (value "D3")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) (tstamps "08950271")) (comp (ref "C11") (value "sw.sw[0,0].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,0].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[0,0].npx.cap")) (property (name "edg_refdes") (value "C11")) @@ -290,7 +290,7 @@ (tstamps "025e0135")) (comp (ref "SW2") (value "sw.sw[1,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,0].sw")) @@ -314,21 +314,21 @@ (tstamps "00650065")) (comp (ref "D5") (value "sw.sw[1,0].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,0].npx.device")) (property (name "edg_short_path") (value "sw.sw[1,0].npx.device")) (property (name "edg_refdes") (value "D5")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) (tstamps "08950271")) (comp (ref "C12") (value "sw.sw[1,0].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,0].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[1,0].npx.cap")) (property (name "edg_refdes") (value "C12")) @@ -338,7 +338,7 @@ (tstamps "025e0135")) (comp (ref "SW3") (value "sw.sw[0,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,1].sw")) @@ -362,21 +362,21 @@ (tstamps "00650065")) (comp (ref "D7") (value "sw.sw[0,1].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,1].npx.device")) (property (name "edg_short_path") (value "sw.sw[0,1].npx.device")) (property (name "edg_refdes") (value "D7")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) (tstamps "08950271")) (comp (ref "C13") (value "sw.sw[0,1].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,1].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[0,1].npx.cap")) (property (name "edg_refdes") (value "C13")) @@ -386,7 +386,7 @@ (tstamps "025e0135")) (comp (ref "SW4") (value "sw.sw[1,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,1].sw")) @@ -410,21 +410,21 @@ (tstamps "00650065")) (comp (ref "D9") (value "sw.sw[1,1].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,1].npx.device")) (property (name "edg_short_path") (value "sw.sw[1,1].npx.device")) (property (name "edg_refdes") (value "D9")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) (tstamps "08950271")) (comp (ref "C14") (value "sw.sw[1,1].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,1].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[1,1].npx.cap")) (property (name "edg_refdes") (value "C14")) @@ -434,7 +434,7 @@ (tstamps "025e0135")) (comp (ref "SW5") (value "sw.sw[0,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,2].sw")) @@ -458,21 +458,21 @@ (tstamps "00650065")) (comp (ref "D11") (value "sw.sw[0,2].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,2].npx.device")) (property (name "edg_short_path") (value "sw.sw[0,2].npx.device")) (property (name "edg_refdes") (value "D11")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) (tstamps "08950271")) (comp (ref "C15") (value "sw.sw[0,2].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,2].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[0,2].npx.cap")) (property (name "edg_refdes") (value "C15")) @@ -482,7 +482,7 @@ (tstamps "025e0135")) (comp (ref "SW6") (value "sw.sw[1,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,2].sw")) @@ -506,21 +506,21 @@ (tstamps "00650065")) (comp (ref "D13") (value "sw.sw[1,2].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,2].npx.device")) (property (name "edg_short_path") (value "sw.sw[1,2].npx.device")) (property (name "edg_refdes") (value "D13")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) (tstamps "08950271")) (comp (ref "C16") (value "sw.sw[1,2].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,2].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[1,2].npx.cap")) (property (name "edg_refdes") (value "C16")) @@ -560,17 +560,17 @@ (node (ref J1) (pin B9)) (node (ref U1) (pin 3)) (node (ref C1) (pin 1)) - (node (ref D3) (pin 1)) + (node (ref D3) (pin 4)) (node (ref C11) (pin 1)) - (node (ref D5) (pin 1)) + (node (ref D5) (pin 4)) (node (ref C12) (pin 1)) - (node (ref D7) (pin 1)) + (node (ref D7) (pin 4)) (node (ref C13) (pin 1)) - (node (ref D9) (pin 1)) + (node (ref D9) (pin 4)) (node (ref C14) (pin 1)) - (node (ref D11) (pin 1)) + (node (ref D11) (pin 4)) (node (ref C15) (pin 1)) - (node (ref D13) (pin 1)) + (node (ref D13) (pin 4)) (node (ref C16) (pin 1)) (node (ref U3) (pin 5)) (node (ref C17) (pin 1))) @@ -604,17 +604,17 @@ (node (ref J2) (pin 5)) (node (ref J2) (pin 9)) (node (ref R4) (pin 2)) - (node (ref D3) (pin 3)) + (node (ref D3) (pin 2)) (node (ref C11) (pin 2)) - (node (ref D5) (pin 3)) + (node (ref D5) (pin 2)) (node (ref C12) (pin 2)) - (node (ref D7) (pin 3)) + (node (ref D7) (pin 2)) (node (ref C13) (pin 2)) - (node (ref D9) (pin 3)) + (node (ref D9) (pin 2)) (node (ref C14) (pin 2)) - (node (ref D11) (pin 3)) + (node (ref D11) (pin 2)) (node (ref C15) (pin 2)) - (node (ref D13) (pin 3)) + (node (ref D13) (pin 2)) (node (ref C16) (pin 2)) (node (ref U3) (pin 1)) (node (ref U3) (pin 3)) @@ -700,28 +700,28 @@ (node (ref D1) (pin 1)) (node (ref R4) (pin 1))) (net (code 22) (name "sw.npx_din") - (node (ref D3) (pin 4)) + (node (ref D3) (pin 3)) (node (ref U3) (pin 4))) (net (code 23) (name "sw.npx_dout") - (node (ref D13) (pin 2))) + (node (ref D13) (pin 1))) (net (code 24) (name "sw.sw[0,0].npx_dout") - (node (ref D3) (pin 2)) - (node (ref D5) (pin 4))) + (node (ref D3) (pin 1)) + (node (ref D5) (pin 3))) (net (code 25) (name "sw.sw[0,0].sw.com") (node (ref SW1) (pin 2)) (node (ref D2) (pin 2))) (net (code 26) (name "sw.sw[1,0].npx_dout") - (node (ref D5) (pin 2)) - (node (ref D9) (pin 4))) + (node (ref D5) (pin 1)) + (node (ref D9) (pin 3))) (net (code 27) (name "sw.sw[1,0].sw.com") (node (ref SW2) (pin 2)) (node (ref D4) (pin 2))) (net (code 28) (name "sw.sw[0,1].npx_din") - (node (ref D7) (pin 4)) - (node (ref D9) (pin 2))) + (node (ref D7) (pin 3)) + (node (ref D9) (pin 1))) (net (code 29) (name "sw.sw[0,1].npx_dout") - (node (ref D7) (pin 2)) - (node (ref D11) (pin 4))) + (node (ref D7) (pin 1)) + (node (ref D11) (pin 3))) (net (code 30) (name "sw.sw[0,1].sw.com") (node (ref SW3) (pin 2)) (node (ref D6) (pin 2))) @@ -729,8 +729,8 @@ (node (ref SW4) (pin 2)) (node (ref D8) (pin 2))) (net (code 32) (name "sw.sw[0,2].npx_dout") - (node (ref D11) (pin 2)) - (node (ref D13) (pin 4))) + (node (ref D11) (pin 1)) + (node (ref D13) (pin 3))) (net (code 33) (name "sw.sw[0,2].sw.com") (node (ref SW5) (pin 2)) (node (ref D10) (pin 2))) diff --git a/examples/TestBlinkyPinned/TestBlinkyPinned.svgpcb.js b/examples/TestBlinkyPinned/TestBlinkyPinned.svgpcb.js index e1d52f4ad..367af44a0 100644 --- a/examples/TestBlinkyPinned/TestBlinkyPinned.svgpcb.js +++ b/examples/TestBlinkyPinned/TestBlinkyPinned.svgpcb.js @@ -113,8 +113,8 @@ const C17 = board.add(C_0603_1608Metric, { }) board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "1"], ["C11", "1"], ["D5", "1"], ["C12", "1"], ["D7", "1"], ["C13", "1"], ["D9", "1"], ["C14", "1"], ["D11", "1"], ["C15", "1"], ["D13", "1"], ["C16", "1"], ["U3", "5"], ["C17", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"], ["D3", "3"], ["C11", "2"], ["D5", "3"], ["C12", "2"], ["D7", "3"], ["C13", "2"], ["D9", "3"], ["C14", "2"], ["D11", "3"], ["C15", "2"], ["D13", "3"], ["C16", "2"], ["U3", "1"], ["U3", "3"], ["C17", "2"]]}, + {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "4"], ["C11", "1"], ["D5", "4"], ["C12", "1"], ["D7", "4"], ["C13", "1"], ["D9", "4"], ["C14", "1"], ["D11", "4"], ["C15", "1"], ["D13", "4"], ["C16", "1"], ["U3", "5"], ["C17", "1"]]}, + {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"], ["D3", "2"], ["C11", "2"], ["D5", "2"], ["C12", "2"], ["D7", "2"], ["C13", "2"], ["D9", "2"], ["C14", "2"], ["D11", "2"], ["C15", "2"], ["D13", "2"], ["C16", "2"], ["U3", "1"], ["U3", "3"], ["C17", "2"]]}, {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "33"], ["R3", "2"]]}, {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "32"]]}, {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, @@ -134,17 +134,17 @@ board.setNetlist([ {name: "mcu.swd.swo", pads: [["J2", "6"]]}, {name: "led.signal", pads: [["U2", "10"], ["D1", "2"]]}, {name: "led.package.k", pads: [["D1", "1"], ["R4", "1"]]}, - {name: "sw.npx_din", pads: [["D3", "4"], ["U3", "4"]]}, - {name: "sw.npx_dout", pads: [["D13", "2"]]}, - {name: "sw.sw[0,0].npx_dout", pads: [["D3", "2"], ["D5", "4"]]}, + {name: "sw.npx_din", pads: [["D3", "3"], ["U3", "4"]]}, + {name: "sw.npx_dout", pads: [["D13", "1"]]}, + {name: "sw.sw[0,0].npx_dout", pads: [["D3", "1"], ["D5", "3"]]}, {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, - {name: "sw.sw[1,0].npx_dout", pads: [["D5", "2"], ["D9", "4"]]}, + {name: "sw.sw[1,0].npx_dout", pads: [["D5", "1"], ["D9", "3"]]}, {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D4", "2"]]}, - {name: "sw.sw[0,1].npx_din", pads: [["D7", "4"], ["D9", "2"]]}, - {name: "sw.sw[0,1].npx_dout", pads: [["D7", "2"], ["D11", "4"]]}, + {name: "sw.sw[0,1].npx_din", pads: [["D7", "3"], ["D9", "1"]]}, + {name: "sw.sw[0,1].npx_dout", pads: [["D7", "1"], ["D11", "3"]]}, {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D6", "2"]]}, {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D8", "2"]]}, - {name: "sw.sw[0,2].npx_dout", pads: [["D11", "2"], ["D13", "4"]]}, + {name: "sw.sw[0,2].npx_dout", pads: [["D11", "1"], ["D13", "3"]]}, {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D10", "2"]]}, {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D12", "2"]]}, {name: "npx_shift.input", pads: [["U2", "11"], ["U3", "2"]]} diff --git a/examples/TestBlinkyRegulated/TestBlinkyRegulated.net.ref b/examples/TestBlinkyRegulated/TestBlinkyRegulated.net.ref index e3517f4ba..8e8f86a3b 100644 --- a/examples/TestBlinkyRegulated/TestBlinkyRegulated.net.ref +++ b/examples/TestBlinkyRegulated/TestBlinkyRegulated.net.ref @@ -242,7 +242,7 @@ (tstamps "0296014b")) (comp (ref "SW1") (value "sw.sw[0,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,0].sw")) @@ -266,7 +266,7 @@ (tstamps "00650065")) (comp (ref "SW2") (value "sw.sw[1,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,0].sw")) @@ -290,7 +290,7 @@ (tstamps "00650065")) (comp (ref "SW3") (value "sw.sw[0,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,1].sw")) @@ -314,7 +314,7 @@ (tstamps "00650065")) (comp (ref "SW4") (value "sw.sw[1,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,1].sw")) @@ -338,7 +338,7 @@ (tstamps "00650065")) (comp (ref "SW5") (value "sw.sw[0,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,2].sw")) @@ -362,7 +362,7 @@ (tstamps "00650065")) (comp (ref "SW6") (value "sw.sw[1,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,2].sw")) diff --git a/examples/TestBlinkyRgb/TestBlinkyRgb.net.ref b/examples/TestBlinkyRgb/TestBlinkyRgb.net.ref index 09562dc7a..5627e034e 100644 --- a/examples/TestBlinkyRgb/TestBlinkyRgb.net.ref +++ b/examples/TestBlinkyRgb/TestBlinkyRgb.net.ref @@ -242,7 +242,7 @@ (tstamps "0296014b")) (comp (ref "SW1") (value "sw.sw[0,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,0].sw")) @@ -266,21 +266,21 @@ (tstamps "00650065")) (comp (ref "D3") (value "sw.sw[0,0].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,0].npx.device")) (property (name "edg_short_path") (value "sw.sw[0,0].npx.device")) (property (name "edg_refdes") (value "D3")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[0,0]/npx/") (tstamps "/015f00eb/09be022f/02a50157/")) (tstamps "08950271")) (comp (ref "C11") (value "sw.sw[0,0].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,0].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[0,0].npx.cap")) (property (name "edg_refdes") (value "C11")) @@ -290,7 +290,7 @@ (tstamps "025e0135")) (comp (ref "SW2") (value "sw.sw[1,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,0].sw")) @@ -314,21 +314,21 @@ (tstamps "00650065")) (comp (ref "D5") (value "sw.sw[1,0].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,0].npx.device")) (property (name "edg_short_path") (value "sw.sw[1,0].npx.device")) (property (name "edg_refdes") (value "D5")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[1,0]/npx/") (tstamps "/015f00eb/09c20230/02a50157/")) (tstamps "08950271")) (comp (ref "C12") (value "sw.sw[1,0].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,0].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[1,0].npx.cap")) (property (name "edg_refdes") (value "C12")) @@ -338,7 +338,7 @@ (tstamps "025e0135")) (comp (ref "SW3") (value "sw.sw[0,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,1].sw")) @@ -362,21 +362,21 @@ (tstamps "00650065")) (comp (ref "D7") (value "sw.sw[0,1].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,1].npx.device")) (property (name "edg_short_path") (value "sw.sw[0,1].npx.device")) (property (name "edg_refdes") (value "D7")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[0,1]/npx/") (tstamps "/015f00eb/09c00230/02a50157/")) (tstamps "08950271")) (comp (ref "C13") (value "sw.sw[0,1].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,1].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[0,1].npx.cap")) (property (name "edg_refdes") (value "C13")) @@ -386,7 +386,7 @@ (tstamps "025e0135")) (comp (ref "SW4") (value "sw.sw[1,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,1].sw")) @@ -410,21 +410,21 @@ (tstamps "00650065")) (comp (ref "D9") (value "sw.sw[1,1].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,1].npx.device")) (property (name "edg_short_path") (value "sw.sw[1,1].npx.device")) (property (name "edg_refdes") (value "D9")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[1,1]/npx/") (tstamps "/015f00eb/09c40231/02a50157/")) (tstamps "08950271")) (comp (ref "C14") (value "sw.sw[1,1].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,1].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[1,1].npx.cap")) (property (name "edg_refdes") (value "C14")) @@ -434,7 +434,7 @@ (tstamps "025e0135")) (comp (ref "SW5") (value "sw.sw[0,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[0,2].sw")) @@ -458,21 +458,21 @@ (tstamps "00650065")) (comp (ref "D11") (value "sw.sw[0,2].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,2].npx.device")) (property (name "edg_short_path") (value "sw.sw[0,2].npx.device")) (property (name "edg_refdes") (value "D11")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[0,2]/npx/") (tstamps "/015f00eb/09c20231/02a50157/")) (tstamps "08950271")) (comp (ref "C15") (value "sw.sw[0,2].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[0,2].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[0,2].npx.cap")) (property (name "edg_refdes") (value "C15")) @@ -482,7 +482,7 @@ (tstamps "025e0135")) (comp (ref "SW6") (value "sw.sw[1,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCellNeopixel")) (property (name "edg_path") (value "sw.sw[1,2].sw")) @@ -506,21 +506,21 @@ (tstamps "00650065")) (comp (ref "D13") (value "sw.sw[1,2].npx.device") - (footprint "edg:LED_SK6812MINI-E") + (footprint "LED_SMD:LED_WS2812B-2020_PLCC4_2.0x2.0mm") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,2].npx.device")) (property (name "edg_short_path") (value "sw.sw[1,2].npx.device")) (property (name "edg_refdes") (value "D13")) - (property (name "edg_part") (value "SK6812MINI-E (Opsco Optoelectronics)")) - (property (name "edg_value") (value "SK6812MINI-E")) + (property (name "edg_part") (value "WS2812C-2020-V1 (Worldsemi)")) + (property (name "edg_value") (value "WS2812C-2020-V1")) (sheetpath (names "/sw/sw[1,2]/npx/") (tstamps "/015f00eb/09c60232/02a50157/")) (tstamps "08950271")) (comp (ref "C16") (value "sw.sw[1,2].npx.cap") (footprint "Capacitor_SMD:C_0603_1608Metric") (property (name "Sheetname") (value "npx")) - (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Sk6812Mini_E")) + (property (name "Sheetfile") (value "edg.parts.human_interface.Neopixel.Ws2812c_2020")) (property (name "edg_path") (value "sw.sw[1,2].npx.cap.cap")) (property (name "edg_short_path") (value "sw.sw[1,2].npx.cap")) (property (name "edg_refdes") (value "C16")) @@ -560,17 +560,17 @@ (node (ref J1) (pin B9)) (node (ref U1) (pin 3)) (node (ref C1) (pin 1)) - (node (ref D3) (pin 1)) + (node (ref D3) (pin 4)) (node (ref C11) (pin 1)) - (node (ref D5) (pin 1)) + (node (ref D5) (pin 4)) (node (ref C12) (pin 1)) - (node (ref D7) (pin 1)) + (node (ref D7) (pin 4)) (node (ref C13) (pin 1)) - (node (ref D9) (pin 1)) + (node (ref D9) (pin 4)) (node (ref C14) (pin 1)) - (node (ref D11) (pin 1)) + (node (ref D11) (pin 4)) (node (ref C15) (pin 1)) - (node (ref D13) (pin 1)) + (node (ref D13) (pin 4)) (node (ref C16) (pin 1)) (node (ref U3) (pin 5)) (node (ref C17) (pin 1))) @@ -604,17 +604,17 @@ (node (ref J2) (pin 5)) (node (ref J2) (pin 9)) (node (ref R4) (pin 2)) - (node (ref D3) (pin 3)) + (node (ref D3) (pin 2)) (node (ref C11) (pin 2)) - (node (ref D5) (pin 3)) + (node (ref D5) (pin 2)) (node (ref C12) (pin 2)) - (node (ref D7) (pin 3)) + (node (ref D7) (pin 2)) (node (ref C13) (pin 2)) - (node (ref D9) (pin 3)) + (node (ref D9) (pin 2)) (node (ref C14) (pin 2)) - (node (ref D11) (pin 3)) + (node (ref D11) (pin 2)) (node (ref C15) (pin 2)) - (node (ref D13) (pin 3)) + (node (ref D13) (pin 2)) (node (ref C16) (pin 2)) (node (ref U3) (pin 1)) (node (ref U3) (pin 3)) @@ -700,28 +700,28 @@ (node (ref D1) (pin 1)) (node (ref R4) (pin 1))) (net (code 22) (name "sw.npx_din") - (node (ref D3) (pin 4)) + (node (ref D3) (pin 3)) (node (ref U3) (pin 4))) (net (code 23) (name "sw.npx_dout") - (node (ref D13) (pin 2))) + (node (ref D13) (pin 1))) (net (code 24) (name "sw.sw[0,0].npx_dout") - (node (ref D3) (pin 2)) - (node (ref D5) (pin 4))) + (node (ref D3) (pin 1)) + (node (ref D5) (pin 3))) (net (code 25) (name "sw.sw[0,0].sw.com") (node (ref SW1) (pin 2)) (node (ref D2) (pin 2))) (net (code 26) (name "sw.sw[1,0].npx_dout") - (node (ref D5) (pin 2)) - (node (ref D9) (pin 4))) + (node (ref D5) (pin 1)) + (node (ref D9) (pin 3))) (net (code 27) (name "sw.sw[1,0].sw.com") (node (ref SW2) (pin 2)) (node (ref D4) (pin 2))) (net (code 28) (name "sw.sw[0,1].npx_din") - (node (ref D7) (pin 4)) - (node (ref D9) (pin 2))) + (node (ref D7) (pin 3)) + (node (ref D9) (pin 1))) (net (code 29) (name "sw.sw[0,1].npx_dout") - (node (ref D7) (pin 2)) - (node (ref D11) (pin 4))) + (node (ref D7) (pin 1)) + (node (ref D11) (pin 3))) (net (code 30) (name "sw.sw[0,1].sw.com") (node (ref SW3) (pin 2)) (node (ref D6) (pin 2))) @@ -729,8 +729,8 @@ (node (ref SW4) (pin 2)) (node (ref D8) (pin 2))) (net (code 32) (name "sw.sw[0,2].npx_dout") - (node (ref D11) (pin 2)) - (node (ref D13) (pin 4))) + (node (ref D11) (pin 1)) + (node (ref D13) (pin 3))) (net (code 33) (name "sw.sw[0,2].sw.com") (node (ref SW5) (pin 2)) (node (ref D10) (pin 2))) diff --git a/examples/TestBlinkyRgb/TestBlinkyRgb.svgpcb.js b/examples/TestBlinkyRgb/TestBlinkyRgb.svgpcb.js index cf479b36c..c39727ed8 100644 --- a/examples/TestBlinkyRgb/TestBlinkyRgb.svgpcb.js +++ b/examples/TestBlinkyRgb/TestBlinkyRgb.svgpcb.js @@ -113,8 +113,8 @@ const C17 = board.add(C_0603_1608Metric, { }) board.setNetlist([ - {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "1"], ["C11", "1"], ["D5", "1"], ["C12", "1"], ["D7", "1"], ["C13", "1"], ["D9", "1"], ["C14", "1"], ["D11", "1"], ["C15", "1"], ["D13", "1"], ["C16", "1"], ["U3", "5"], ["C17", "1"]]}, - {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"], ["D3", "3"], ["C11", "2"], ["D5", "3"], ["C12", "2"], ["D7", "3"], ["C13", "2"], ["D9", "3"], ["C14", "2"], ["D11", "3"], ["C15", "2"], ["D13", "3"], ["C16", "2"], ["U3", "1"], ["U3", "3"], ["C17", "2"]]}, + {name: "usb.pwr", pads: [["J1", "A4"], ["J1", "A9"], ["J1", "B4"], ["J1", "B9"], ["U1", "3"], ["C1", "1"], ["D3", "4"], ["C11", "1"], ["D5", "4"], ["C12", "1"], ["D7", "4"], ["C13", "1"], ["D9", "4"], ["C14", "1"], ["D11", "4"], ["C15", "1"], ["D13", "4"], ["C16", "1"], ["U3", "5"], ["C17", "1"]]}, + {name: "usb.gnd", pads: [["J1", "A1"], ["J1", "A12"], ["J1", "B1"], ["J1", "B12"], ["J1", "S1"], ["R1", "1"], ["R2", "1"], ["U1", "1"], ["C1", "2"], ["C2", "2"], ["U2", "23"], ["U2", "35"], ["U2", "44"], ["U2", "47"], ["U2", "8"], ["C3", "2"], ["C4", "2"], ["C5", "2"], ["C6", "2"], ["C7", "2"], ["C8", "2"], ["X1", "2"], ["X1", "4"], ["C9", "2"], ["C10", "2"], ["J2", "3"], ["J2", "5"], ["J2", "9"], ["R4", "2"], ["D3", "2"], ["C11", "2"], ["D5", "2"], ["C12", "2"], ["D7", "2"], ["C13", "2"], ["D9", "2"], ["C14", "2"], ["D11", "2"], ["C15", "2"], ["D13", "2"], ["C16", "2"], ["U3", "1"], ["U3", "3"], ["C17", "2"]]}, {name: "usb.usb.dp", pads: [["J1", "A6"], ["J1", "B6"], ["U2", "33"], ["R3", "2"]]}, {name: "usb.usb.dm", pads: [["J1", "A7"], ["J1", "B7"], ["U2", "32"]]}, {name: "usb.conn.cc.cc1", pads: [["J1", "A5"], ["R1", "2"]]}, @@ -134,17 +134,17 @@ board.setNetlist([ {name: "mcu.swd.swo", pads: [["J2", "6"]]}, {name: "led.signal", pads: [["U2", "10"], ["D1", "2"]]}, {name: "led.package.k", pads: [["D1", "1"], ["R4", "1"]]}, - {name: "sw.npx_din", pads: [["D3", "4"], ["U3", "4"]]}, - {name: "sw.npx_dout", pads: [["D13", "2"]]}, - {name: "sw.sw[0,0].npx_dout", pads: [["D3", "2"], ["D5", "4"]]}, + {name: "sw.npx_din", pads: [["D3", "3"], ["U3", "4"]]}, + {name: "sw.npx_dout", pads: [["D13", "1"]]}, + {name: "sw.sw[0,0].npx_dout", pads: [["D3", "1"], ["D5", "3"]]}, {name: "sw.sw[0,0].sw.com", pads: [["SW1", "2"], ["D2", "2"]]}, - {name: "sw.sw[1,0].npx_dout", pads: [["D5", "2"], ["D9", "4"]]}, + {name: "sw.sw[1,0].npx_dout", pads: [["D5", "1"], ["D9", "3"]]}, {name: "sw.sw[1,0].sw.com", pads: [["SW2", "2"], ["D4", "2"]]}, - {name: "sw.sw[0,1].npx_din", pads: [["D7", "4"], ["D9", "2"]]}, - {name: "sw.sw[0,1].npx_dout", pads: [["D7", "2"], ["D11", "4"]]}, + {name: "sw.sw[0,1].npx_din", pads: [["D7", "3"], ["D9", "1"]]}, + {name: "sw.sw[0,1].npx_dout", pads: [["D7", "1"], ["D11", "3"]]}, {name: "sw.sw[0,1].sw.com", pads: [["SW3", "2"], ["D6", "2"]]}, {name: "sw.sw[1,1].sw.com", pads: [["SW4", "2"], ["D8", "2"]]}, - {name: "sw.sw[0,2].npx_dout", pads: [["D11", "2"], ["D13", "4"]]}, + {name: "sw.sw[0,2].npx_dout", pads: [["D11", "1"], ["D13", "3"]]}, {name: "sw.sw[0,2].sw.com", pads: [["SW5", "2"], ["D10", "2"]]}, {name: "sw.sw[1,2].sw.com", pads: [["SW6", "2"], ["D12", "2"]]}, {name: "npx_shift.input", pads: [["U2", "11"], ["U3", "2"]]} diff --git a/examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.net.ref b/examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.net.ref index a911d816e..dcdbfe931 100644 --- a/examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.net.ref +++ b/examples/TestBlinkySwitchMatrixRefined/TestBlinkySwitchMatrixRefined.net.ref @@ -38,7 +38,7 @@ (tstamps "0296014b")) (comp (ref "SW1") (value "sw.sw[0,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,0].sw")) @@ -62,7 +62,7 @@ (tstamps "00650065")) (comp (ref "SW2") (value "sw.sw[1,0].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,0]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,0].sw")) @@ -86,7 +86,7 @@ (tstamps "00650065")) (comp (ref "SW3") (value "sw.sw[0,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,1].sw")) @@ -110,7 +110,7 @@ (tstamps "00650065")) (comp (ref "SW4") (value "sw.sw[1,1].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,1]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,1].sw")) @@ -134,7 +134,7 @@ (tstamps "00650065")) (comp (ref "SW5") (value "sw.sw[0,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[0,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[0,2].sw")) @@ -158,7 +158,7 @@ (tstamps "00650065")) (comp (ref "SW6") (value "sw.sw[1,2].sw") - (footprint "Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") + (footprint "PCM_Switch_Keyboard_Hotswap_Kailh:SW_Hotswap_Kailh_MX") (property (name "Sheetname") (value "sw[1,2]")) (property (name "Sheetfile") (value "edg.circuits.SwitchMatrix.DiodeSwitchCell")) (property (name "edg_path") (value "sw.sw[1,2].sw")) diff --git a/getting_started_hierarchy_layout.md b/getting_started_hierarchy_layout.md index c21f1cc5e..ca8b3ce8b 100644 --- a/getting_started_hierarchy_layout.md +++ b/getting_started_hierarchy_layout.md @@ -18,7 +18,9 @@ For hierarchical loading and replication, you have two options: ![Sublayout](docs/kicad/pcm_sublayout.png) - This was designed to work with netlist-based flows and automatically detects grouping based on hierarchy data in the netlist. - This works with KiCad 10+, but zone replication is broken. -- Replicate Layout, Save/Restore Layout, and HierarchicalPCB will **NOT work**. These require and validate against schematic files, which are not generated in this HDL flow. + +> Replicate Layout, Save/Restore Layout, and HierarchicalPCB will **NOT work**. +> These require and validate against schematic files, which are not generated in this HDL flow. ## Netlist Import @@ -31,10 +33,36 @@ For hierarchical loading and replication, you have two options: ![pcb_netlist.png](docs/kicad/pcb_netlist.png) > If you launched the PCB Editor from a KiCad project, this will not be on the toolbar (you will have "Update PCB from Schematic" instead). > You can still access it from the menu: File > Import > Netlist... +3. Select the generated netlist file, likely `BlinkyExample/BlinkyExample.net` in whereever you ran your HDL script, then click Load and Test Netlist. + It should load with no errors, but there may be some warnings about missing pins. + ![pcb_netlist_dialog.png](docs/kicad/pcb_netlist_dialog.png) + + > In KiCad 10, uncheck "Group footprints based on symbol group". + > This ignores hierarchical data in the netlist and removes footprint grouping. + +4. Click "Update PCB" to place the components on the board. + Drop them anywhere for now. + ![pcb_initial.png](docs/kicad/pcb_initial.png) + - This may give you error(s) about missing pins, which you can ignore. + + +## Replicating the Switch Cells + +The switch, diode, LED, and LED capacitor are all part of a SwitchCell hierarchical sheet in the netlist, which allows the layout to be replicated for each switch. + +Start by laying out a single switch cell. +Here is an example layout: + +![pcb_switchcell.png](docs/kicad/pcb_switchcell.png) + +> Tip: use the footprint pathname on the F.Fab layer to find the footprints that are part of the same block. +> For example, find all the footprints starting with `sw.sw[0,0]`. -3. Select the generated netlist file, likely `BlinkyExample/BlinkyExample.net` in whereever you ran your HDL script. +> Right-click > Select > Items in Same Hierarchical Sheet only selects items strictly in the same sheet, not recursively. +> For example, selecting the hierarchical sheet for the switch includes the diode, but not the LED or LED capacitor, which are in a sub-sheet. +## Loading a Microcontroller Layout -> In KiCad 10, uncheck "Group footprints based on symbol group". -> This ignores hierarchical data in the netlist and removes footprint grouping. +_The tutorial only covers using the Sublayout plugin._ +_It may be possible to create a design block library using KiCad 10+, but that is a more heavyweight flow and is not covered._ From a9bb6de4cfefe2adc7697ab507591561f5d3705a Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 11:23:24 -0700 Subject: [PATCH 26/41] wip --- docs/kicad/kicad_array.png | Bin 0 -> 16232 bytes docs/kicad/kicad_designblocks_empty.png | Bin 0 -> 7342 bytes docs/kicad/pcb_switcharray.png | Bin 0 -> 14566 bytes docs/kicad/pcb_switcharray_ordered.png | Bin 0 -> 11801 bytes docs/kicad/pcb_switchcell.png | Bin 17648 -> 18088 bytes docs/kicad/pcb_switchcell_anchor.png | Bin 0 -> 21704 bytes docs/kicad/pcb_switchcell_group.png | Bin 0 -> 22282 bytes docs/kicad/pcb_switchmatrix_replicated.png | Bin 0 -> 20369 bytes docs/kicad/sublayout_selected.png | Bin 0 -> 9754 bytes getting_started_hierarchy_layout.md | 65 ++++++++++++++++++--- 10 files changed, 58 insertions(+), 7 deletions(-) create mode 100644 docs/kicad/kicad_array.png create mode 100644 docs/kicad/kicad_designblocks_empty.png create mode 100644 docs/kicad/pcb_switcharray.png create mode 100644 docs/kicad/pcb_switcharray_ordered.png create mode 100644 docs/kicad/pcb_switchcell_anchor.png create mode 100644 docs/kicad/pcb_switchcell_group.png create mode 100644 docs/kicad/pcb_switchmatrix_replicated.png create mode 100644 docs/kicad/sublayout_selected.png diff --git a/docs/kicad/kicad_array.png b/docs/kicad/kicad_array.png new file mode 100644 index 0000000000000000000000000000000000000000..162f183bd2fdcca13731497d9e8930591f5c9843 GIT binary patch literal 16232 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 literal 0 HcmV?d00001 diff --git a/docs/kicad/kicad_designblocks_empty.png b/docs/kicad/kicad_designblocks_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..b087fa948bbcb715d0c5472defccea8734105518 GIT binary patch literal 7342 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 literal 0 HcmV?d00001 diff --git a/docs/kicad/pcb_switcharray.png b/docs/kicad/pcb_switcharray.png new file mode 100644 index 0000000000000000000000000000000000000000..c6c6ecc7fa8f36a79d74765703503b4b16e1fe4a GIT binary patch literal 14566 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 R0G_V3d#AGlb;sev{{tf&CE@@8 literal 0 HcmV?d00001 diff --git a/docs/kicad/pcb_switchcell.png b/docs/kicad/pcb_switchcell.png index e00d27820e14199a81149abf9b7a81cf92be57a3..f9f35ac39038794c16579cb871c1af1fffc41f04 100644 GIT binary patch literal 18088 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 literal 17648 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 z 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 X@l=i9?E~Iqa^j|r!L>pyoACb!M_D~` diff --git a/docs/kicad/pcb_switchcell_anchor.png b/docs/kicad/pcb_switchcell_anchor.png new file mode 100644 index 0000000000000000000000000000000000000000..ed08a4b61fe14527073fcc1c0ec23816bf6337e3 GIT binary patch literal 21704 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 literal 0 HcmV?d00001 diff --git a/docs/kicad/pcb_switchcell_group.png b/docs/kicad/pcb_switchcell_group.png new file mode 100644 index 0000000000000000000000000000000000000000..0b9049cb331368bd43080ab8571e5e1aba684f3d GIT binary patch literal 22282 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 OX+C=Tu;_ustN#Gws_fYS literal 0 HcmV?d00001 diff --git a/docs/kicad/pcb_switchmatrix_replicated.png b/docs/kicad/pcb_switchmatrix_replicated.png new file mode 100644 index 0000000000000000000000000000000000000000..2adfc6e28a5fe46bf5e528e8fc08b4be822fedca GIT binary patch literal 20369 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ℜr;$VV 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 O0G0a>6~Emx4froh$_*O; literal 0 HcmV?d00001 diff --git a/getting_started_hierarchy_layout.md b/getting_started_hierarchy_layout.md index ca8b3ce8b..8082c5b40 100644 --- a/getting_started_hierarchy_layout.md +++ b/getting_started_hierarchy_layout.md @@ -2,6 +2,9 @@ Hierarchical layout tips and tricks, using the macropad circuit from the [introductory tutorial](getting-started.md) as an example. +This assumes familiarity with KiCad PCB layout. +If you're new to KiCad, there are plenty of excellent tutorials online, go through one of those, then come back. + ## Requirements @@ -9,15 +12,18 @@ The example uses the Keyswitch Kicad Library, available on the KiCad Plugin and ![Keyswitch](docs/kicad/pcm_keyswitch_library.png) -For hierarchical loading and replication, you have two options: +For hierarchical loading and replication, you have a few options: -- Use KiCad 10+ and the native design blocks feature. - - This tutorial covers hierarchical replication, but hierarchical loading is not covered. - - The design blocks flow is heavyweight (requires local library creation) and (at least for netlist driven flows, like this one) requires you to group footprints within a block manually. - Use the Sublayout plugin (KiCad 8+), also available on the KiCad Plugin and Content Manager. ![Sublayout](docs/kicad/pcm_sublayout.png) - This was designed to work with netlist-based flows and automatically detects grouping based on hierarchy data in the netlist. - This works with KiCad 10+, but zone replication is broken. +- Use KiCad's native design blocks feature (KiCad 10+). + - This tutorial covers hierarchical replication, but hierarchical loading is not covered. + - The design blocks flow is heavyweight (requires local library creation) and (at least for netlist driven flows, like this one) requires you to group footprints within a block manually. +- Use KiCad's Multi-Channel and Placement Rule Area feature. + - This tutorial does not cover this. + - This seems brittle to other traces overlapping the placement rule area and does not seem grouping-aware. > Replicate Layout, Save/Restore Layout, and HierarchicalPCB will **NOT work**. > These require and validate against schematic files, which are not generated in this HDL flow. @@ -46,21 +52,66 @@ For hierarchical loading and replication, you have two options: - This may give you error(s) about missing pins, which you can ignore. -## Replicating the Switch Cells +## Switch Matrix Placement and Replication The switch, diode, LED, and LED capacitor are all part of a SwitchCell hierarchical sheet in the netlist, which allows the layout to be replicated for each switch. -Start by laying out a single switch cell. +Start by arranging all the switch footprints in a grid. + +This can be done by selecting all the switch footprints, then right-clicking and selecting Create From Selection > Create Array... +Set the grid array size (here, 3x2 as consistent with the HDL parameters) and spacing (19.05mm typical for mechanical keyboard switch spacing). +Set Item Source to Arrange selection (move the footprints, instead of creating new ones), and the Grid Position to Source items remain in place. + +![kicad_array.png](docs/kicad/kicad_array.png) + +![pcb_switcharray.png](docs/kicad/pcb_switcharray.png) + +You may need to swap components to get the right ordering. + +![pcb_switcharray_ordered.png](docs/kicad/pcb_switcharray_ordered.png) + +Then, lay out a single switch cell, including the switch, diode, LED, LED capacitor, and traces. Here is an example layout: ![pcb_switchcell.png](docs/kicad/pcb_switchcell.png) +In this layout, I've allocated the top layer to run horizontal traces (rows and LEDs) and the bottom layer to run vertical traces (columns). + > Tip: use the footprint pathname on the F.Fab layer to find the footprints that are part of the same block. > For example, find all the footprints starting with `sw.sw[0,0]`. -> Right-click > Select > Items in Same Hierarchical Sheet only selects items strictly in the same sheet, not recursively. +> Right-click > Select > Items in Same Hierarchical Sheet only selects items _strictly_ in the same sheet, not recursively. > For example, selecting the hierarchical sheet for the switch includes the diode, but not the LED or LED capacitor, which are in a sub-sheet. +Group the switch cell footprints: select them, right click, Grouping > Group Items. + +![pcb_switchcell.png](docs/kicad/pcb_switchcell_group.png) + +### Option 1: Sublayout Plugin + +1. Enter into the switch cell footprint group you just created and select the switch. + ![pcb_switchcell_anchor.png](docs/kicad/pcb_switchcell_anchor.png) + The group defines the objects to replicate, while the selected footprint defines the _anchor footprint_, the matching component in the other sheets that other footprints are placed around. + +2. Run the Sublayout plugin and select all the instances (bottom list box). + ![sublayout_selected.png](docs/kicad/sublayout_selected.png) +3. Press Replicate, and the plugin will replicate the layout, including footprint positions, traces, and groupings. + ![pcb_switchmatrix_replicated.png](docs/kicad/pcb_switchmatrix_replicated.png) + + +### Option 2: KiCad Design Blocks + +_KiCad 10+ required._ + +1. Open the Design Blocks panel: main menu > View > Panels > Design Blocks. + ![kicad_designblocks_empty.png](docs/kicad/kicad_designblocks_empty.png) + +### Snaking + +The LEDs are connected in a snaking pattern, which means every other row reverses the LED connection order. +You may want to have a different switch cell for the odd rows, which flips the LED rotation. + + ## Loading a Microcontroller Layout _The tutorial only covers using the Sublayout plugin._ From c12fec7e3e54fe52ba1db3416071ef256097a05b Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 13:19:51 -0700 Subject: [PATCH 27/41] wip --- docs/kicad/kicad_array.png | Bin 16232 -> 18437 bytes docs/kicad/kicad_designblocks_newgroup.png | Bin 0 -> 21822 bytes docs/kicad/kicad_designblocks_newlibrary.png | Bin 0 -> 5963 bytes docs/kicad/kicad_designblocks_refprop.png | Bin 0 -> 17165 bytes docs/kicad/kicad_designblocks_replicate.png | Bin 0 -> 17978 bytes docs/kicad/kicad_designblocks_save.png | Bin 0 -> 8816 bytes docs/kicad/kicad_designblocks_switchcell.png | Bin 0 -> 13050 bytes docs/kicad/pcb_switcharray.png | Bin 14566 -> 18927 bytes docs/kicad/pcb_switcharray_ordered.png | Bin 11801 -> 14546 bytes docs/kicad/pcb_switchmatrix_replicated.png | Bin 20369 -> 31987 bytes getting_started_hierarchy_layout.md | 48 +++++++++++++++++-- 11 files changed, 43 insertions(+), 5 deletions(-) create mode 100644 docs/kicad/kicad_designblocks_newgroup.png create mode 100644 docs/kicad/kicad_designblocks_newlibrary.png create mode 100644 docs/kicad/kicad_designblocks_refprop.png create mode 100644 docs/kicad/kicad_designblocks_replicate.png create mode 100644 docs/kicad/kicad_designblocks_save.png create mode 100644 docs/kicad/kicad_designblocks_switchcell.png diff --git a/docs/kicad/kicad_array.png b/docs/kicad/kicad_array.png index 162f183bd2fdcca13731497d9e8930591f5c9843..37948f1a90267e07e65a5a25ca72c336a498d852 100644 GIT binary patch literal 18437 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 literal 16232 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 diff --git a/docs/kicad/kicad_designblocks_newgroup.png b/docs/kicad/kicad_designblocks_newgroup.png new file mode 100644 index 0000000000000000000000000000000000000000..b812051e1c9752f7166a998d33e5ac11788b874b GIT binary patch literal 21822 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 OIC0eS$ZsYWBL4;Q<2FJ7 literal 0 HcmV?d00001 diff --git a/docs/kicad/kicad_designblocks_newlibrary.png b/docs/kicad/kicad_designblocks_newlibrary.png new file mode 100644 index 0000000000000000000000000000000000000000..05f943873888eb154411b8dc9705b0024af2bbbd GIT binary patch literal 5963 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 literal 0 HcmV?d00001 diff --git a/docs/kicad/kicad_designblocks_refprop.png b/docs/kicad/kicad_designblocks_refprop.png new file mode 100644 index 0000000000000000000000000000000000000000..fa0f6a11b74dea6bfeb7e2ed8e354f1321fb5b24 GIT binary patch literal 17165 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 literal 0 HcmV?d00001 diff --git a/docs/kicad/kicad_designblocks_switchcell.png b/docs/kicad/kicad_designblocks_switchcell.png new file mode 100644 index 0000000000000000000000000000000000000000..a2cbac17dee1bf24afa68eebd05fee9b53cd301c GIT binary patch literal 13050 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 HKKy?GIL&QO literal 11801 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 R0G_V3d#AGlb;sev{{tf&CE@@8 diff --git a/docs/kicad/pcb_switchmatrix_replicated.png b/docs/kicad/pcb_switchmatrix_replicated.png index 2adfc6e28a5fe46bf5e528e8fc08b4be822fedca..8dbd8b1901ce75009fb85a443be6857d1a64cd97 100644 GIT binary patch literal 31987 zcmb^3XIv9c-za<#1fo=f0@4&NgNStL5JW^QgeXW+q>D6>CJ;(MAkvEn(mT?-(mSCF z0zpdXodgIyG($TJ|LeNXeV^xfcg_nx`ysPCyF0TpJM)|G8u(mYmG08@OJrnZbWa{X z)F2}xHzp&yz(hj@{E{F+8w_m79W_)RkQMcEECYW~nk&JS$jC~=FCQ6S1pWruJ$~g# zMt0@n*+25Bciafz$15LIbU$j^zWeB6>|jQw>R@K}!O_C@qk$F;aEOQ1lZQ$#5e94Z z))+x8*Ns}m%sbo~PI(1mTJBy?Z)vSFi1L4Z>JSC{4dP)8^qDXw|4|jd0}tET#(nk*O4;@EZTT{g*Yw@Y&3d{S!jH2 z&`_ZZX@QMj^Z%>Ooxj|tYr%S$SlsLPN1v4G3v9rY)z9JA+IJ_?MT@xyEj=+zAI!dd z@4d%;ysq`6G@Z-7Fr%qlh-OT~JenW*+Gfntj!Sk8R4MlO!c7B@Hp>sRH?r)n7P0Ua zT=r4P8PIr|QZdE*aSVKx$p_U`lXpTc%=~HoRlY^f>s=9~vR(cM*$T7TRNwB0+_?4n zY6ULyVPYPGPZmZupLS?PvqxG*T^)0!QmoU5r(*7{j8ob772j0BJXo!`wgOLhb$kZq zlZ~R1YSlL--hxksC0eWTs(D;wN+mQ?^xC_*sy#Q2n4dXXKYae)07L%4jFD1Fg!Y4(KeO!--l%8mqv*A|L%LyVIM{by+qu(%>iXT! zrNv%Lj>uPX;5`GwOIe{sr@GC@uKQeSDdl3bQe4}!4j2Z7o#!PGqx$L-ZLp~iWHt0= ztdO-eTG~yW#DBR=Z)35KCEm0=}Xk9psYPcRcNZd6SUVx4wz1 zp)*FSs|#th2RjzSzNp6VP!ryvhY{1xQ<;u7eo&U|XGlMgoQ%`+nV4y(jj_vzQoRjt zFB=$W)-cQH@_})5o12Si*yG``-*kZ7y7PNW`>Tmpb`>9e#i9n4)4B-%Wjm7E&}PMJ%P4BIc^tX6n}!0Z6~`;YhQ7r{qc~xv>JlSnGF$C z31lPh?fltA0rPU9Qhvwb?^hIyW|jrogN&fPGcJLMWE~yPj?A*G?P)w2X@ff^l-F!YKNx*gID<0rsW38$~b@Eq$gC8m$t+!?W9#NU{%Z=Ntu>z~XfJYdj4iv-j zrhDwB2ntlmt5#(`(G`8y3Vn0i69lFQe^8FK>#O=E2m*iT_@Ux?VxBA%*0@({GTzJg zG-6I-#t~YdUA5AH4;KG0srBY?C?#rl<8*NS$B9qve)J;4@7{j;)DX{2HrN8t7{_C; zkai@7ZY4ucmpa3*Zp2xx?C2%mk*GM%$_`?f{#iN5TIPxi8Tc?2pnq5nWF<{)(ZM?P z@)6r~-es_)y_voWz5EO3P#66IP=km49w$4_Z3PCuR*57m&c(-V8AyR89)|F)7}ww@ zsv}&s)dnk}z_Xx*W0?B;u@o6yNh~(F>-gcQ{aK{AF(YY}Wut~V>7#2kf7Nn=@HeWE zVvOPGE=w>cL)~*L@YrFKS}kTebQ)nF3CiGf=%?Ss;ON9{{LX5SX9GA^7aUaa42{bE zoSj{?RW$AoZ9&1_yfTm2KaT2i&!a}8T2PL$U;pzf1w2uIR-XX{@(1DPmh%Ma2;L&I zekhReBg5LzK_QCs1hK0?2b56tW1WZE^vJ8wh6bDr(Zm3aJy780HeJmXx1=VeSi4v| zO>OtPkk9^oU~N>QcAHFJ9zyL)7wmU z6DI71#EN8nn@RTTFmEvJ{cbXf zHYVSSQf8S)@`D3urQ|pD>gux8dQgRuN>5Yn8M6~RC;x?lcI2NOLanaBbJ}{`7vtOR z)l_L8UK9A{<;+{H&r{Tz;>P(f%x4fjL=kAl#%NFhMw91sr$uq?H>&oEG$_rsBn%Sb z^?0xxH$7YlNCTe-ebLwFEtcR}DIZIh4pT!5185qJ}Oy6kYtmPY}2Q0w2Zdmhh# zpEVcoOd)6#X;XL|KJ5*U+i-%i7K9}i@E4BLex7j+iZ_=S*;NY~L+O;lB)4c`FjmseHuHuOR2%uar47F4Zr$({G5ovW8P5L?XoM(F#nkzhUTW>mGzr$@pQp13y& z(m-;YBs)rEmbTprea~R>h1!dehjh~W2`2wit8&lVc`{$#*FLP20;6Ru$OLh_^q3Zb zQaoC~W+7&Y^AtO#_l#+dfOn$2t8t_Xu!|2!*;Wg31oUDycT&#!X-|K{vc=ck!+dlH zHhBHlD~?uu?eb&SMPj2s+#X$57mH)(Vq7byci#Su#K*EmDSGs^3n!VR>P%H`m7BFr zNr}HYT3P1fMi|fQxS6kQ`f-|YSMSHo;iwI-CxJ|@8y;PCL?!I6oA${5Xtc;Nq7-q`sfsS^91 z$Dyq67%$jKEUHxdD99pVRPq5LUj|LM4($F@;C%P*sC7`5z-qaJA+^CyvlLZn%SV}g zeO3`&DKOO($@#NE_Ahs4p!15MqD7;`AA^uDlrl>mbh~m^5!_!zj~t2^0gYEa3Q8yg zWu^BO(XpaH=Fe~KOk}^TPE~ZLL*|*ArV`w5Ox5o^F{Gj$?ngC0C#hM2)l^cDtRghv zUZdM-?&*2%dDxhyU(bQY`Kh@kUWD~&illZsUwU5yEvs4=YS%k4JrsnGMW>rQ3(Q@~ zHJHA@hrFzh73_F9R`MR)+Yhm@LRWj0JV;qv1~T}r#(F;raU;9wzGxily)XlMww7YS z?Bo@?TXuh9Fhhx?D>AwjAYWOV3lhe{MIp1;=#D;3_l*pY zoYf}9SERNcPVF_9-Im!ON2SrShBTubpM&@2x_<2bk_ySr>$^z{+_Id^_rlJrG%a(B znVS#SL3X!ypx2BapA|4PcnOT%pAy;oD9-H09V`+>?hA|){l7o_&^SAQmvS!v&ATNZ z_@)2yy{A${?jqAic#BqEjvO153b9v!ODTI32nrQ9J3iGW&YvB3|819T!)9LXCZ+v& z*5yG|J%K*7_l2edZPmK>1kPJh3#=WT)+f5=6F3FeT%oOE0N!+RGF;WR_jb0Z$UhtK zeM+<7y{BQ`gzOhwI^ZP3aU&I@{ zPRCEHrB4<(7bBchJ$540AF9XyCPu-k`dqCa3>;Mi zo7KcyQUmiXLj5489$4nMi9(l~j_44=S!dOdVruRAg zfh!G?s;)*HmtPbrUc)!`|2IZ5y4nPJ?&R1gSZI% zR3(2n;usGkfxylVo$2VjD-SfsP9!Qm-rCM<+-8(C^qX=024WEH)4T_~1mb0pE9ZZn z-7Nj9m%3UHEV}LlCKgvO%TOkZ&ECYh20`Ro>lS}3)qlCUV+liyj&US`Hb%Bcl)L0q zHA0Y(Qruj5ar*Lz2$o=k4qjo|R|V4}8^W*+K@d~D3dxSQ=uFT0`!PnTv8zrZ#^I7a zdls@4W|xt-!3N9|(>1Xr9b!Ax?`^_9@U3b)(@+Kd>J^}ewu3kC;y1Ggq?uQYQ+!x%>WzE+g~EdKfQzX1v9149i0l27 z!FL|&2NDxq^v(AZVnvpS<6BFi7aK27{PiC$9!Sb6v;N@VdTWkVI({!aU?d!#sfFE~~Nge2`}ec!33J%83sJHXS=5&NcFA=q>iZWGSoU#OVS z?1Z$<^$v~fzO?g)G$hGvP13=ItvYAKetq$yO6;bcno^3g)!ErzU38fK*HTc!6o&2T zsxi7n>>`prvj=E<=31;zm-J~k;N;#c><`Y8#DS!=^Q3P}dO(sqb%9EX2?N-G9_TQq z&u>#Zv;hT;A_v#8PsRXq#+VM~ozZN`7F1HA)^~!Ga*ZcgD5jy63sUzcE48no?5qV9 zhy@4LU$!Tns*GSq>#!5@Bt~FdFU{%;)k?tJAs`G?xX-iBB5RF5yvOLOACRDHZ>`Wr zNFA}?nS+7ATr9vVH*DhW2vN3X_#H6C6qi`7bbo9({oNfSqr*+Qk`=7$)beCy0#FAl^I+Swq9s#aWS#gNw~&@G4f9W2XW z)^+jRn#QcLf|bjqBD3UA1pS8R<<0UQax-f&e0h1S+jLyNrSsFw9?{LKDEv7rgN1Lk zW3Lbe!oSGOsFBhB@{Ep9-BaphdSM^GOt)YKeyIQ@H!((2%nADGf3H!Y2*@w7c}1|% zpElBYvCrV~c<9&|x#G;uSgm6V0{6D)F$^*R1J)tO4_^9_`F(kZ-Tjcxe!e2{Ctw^} zAgANLjD_umID8s%wC-hXqWs`13fQjddk>~GURBF0@NYNmXeKWi9Nv6SC>)KGIzs-1 z1mKtkUo1#|IMe{ETbe%Bz!r-c_Yg5B_bT&}LM48|yz4j=@H_q-Z3L;Sm1afmuIo#Y z_MdIML&-fKT)<1RbVNZ%lXF1hteA@WdF=`^sShl)MyWc6?itqTjwI5FSeDb%p|{^n zfS^owp=QkrwS~Gqw=~vuNT!9!teu9EzBI+XSx}Dz-wiGICeNUk3lmr;jl+<{8Z92| z;Y)CZ=(sbD2KEi`k{}J%ER99vSr6)`AY7}Rt}WOV+LhUqy`QfrK=Kb}hg$0in(C)M ziK=EFmKk>4-C3TDkuYwrbJzgpj7^~wa?7l@A%Tzr3bnv*h-0QQQ@y=hr-#MZGWF#= z?o=5kq%Jx6Z}yc{itEp3qsWx@-udNO_8x}FC4Cgo+fJ&7M^W4eulup3>?3W0QB8I+f7J)dXTJ-1bT|gz@T${X&(@9&-ge zv@`^2*ZZcYUp_o9c5c#oz?vyxpzOD7af5owZDrHfe*9>Z?P308+o;PbKNNu<$dqKm znm$c&>lK5sUcdipH@Dh%M!Vu6_Ztprs-Pzs82+ame`D@aR}B0ZE`>L73|o)p!xio` zx9*02ied21T)En_wf&;w&Bm>ZC*=)?$%m3d6vs4-4m-)@hbA1y^NEVe4K{c`P{wbL zScRgYL6rS>5CM6&1w~$*U-JU|jx#JdI?qTCJ;`>6?jNYN$$r^(H~w(DvQay_)Swkd zHn?$$^OYRBN$vE$!!y?Wu*59n>ioii1XTf4qTSk(L)9wsc>?BN4t5XOY{u77Y)0ZX5}uXT5{5ieAlL^Ig+@1O=+$Z6dM+9xC23T-s1%D`?FHdp`dO-7gzePH+3v zVw6Dbw3xtBtPg(li?#h1wRmgC7IAs9Zmr;bN4r?Beew0vfs9_kKK_sElG4Q@b5WhI zaL6=83FCVDzVbE3nfO7zjf;3IwASkfqr=Mxn-Jtor}UxDd%4Ufv}O|wbg}ak4C{68 zl3Qf&M{4mt8jTl%#hLBda8o;T-NO#>b$1%;y`df(+{2_d7#f!cntlWQw4J)#TL=P% z`xfI$b^>}$-dE_m;zfw{-d1v{NGpX>x|k{qYgj$8nq9{z*SFd*!gQKGxBG zvMo5GoAiT`s<3wNDRE;xc7G<*!rKl$v3w3uSNAANrgAbcyRzMgE_1y1t`%DLLl61; zVyD&1H;P2t>mA$j%~P%=WS9+m?Lwo*KtHM`LksdjJ!#r?q%DxoR3$w z^8+W!k)Cr zq)>@w!Gmc`$=34bxH@Nd%hbDbW!v`19Y{}h^LH6JyMl0k?s>P{g;g-ibj#~J_up-Q zamd^4Df8e-+~#wHwZ8wP_nnFImG$Tm$v2H0Ben^LJr~E&5;-@6vv2uGT0BGg3?7J3 zNf?I~?sPMy_M*04he^QXW^*rYmb6bHH@|6ntCn#v@2k(ynuYj`v|%og95qS4+D)?CD}z? zwH~`RKIH@Adu==JdTgPugMBi@UlFc&z;K#dwTp@D$`~H^v;6%_YRSDrZJ&3d4k z=vDVcHR5M4bfjFdKx(C)T0M4?@crY@+clE8*18mVKF6cb)L-JB1eXenpLEDrk@8$4 zS|G;30G2fC``2A3dx?J)7S|N%_&bJ}-9}8xd6_rPZ7CkL$lNA+#``!k%QSNkU*9jL z>%zvH--zK+jkAYJH=A+S`A>dd5$e0;-!*PCGaH`br5+^_lB&UUmo6 z0lU%ZZFaMatNz5Zf0FvDdH#fnJrrZEHiXg=SKjJwY|PR~m_llMOD2Qn6LoDa z^khI^W#5k+#J^6ko3{O3s@@$kpCcN5wLM^XRHfyCGo2#WBh#uAR5y<2w9W8z>dh*G z6ywW*VG5v45!7bI}+*nLhS1WBH0zB9GorQF1JYUl4^w_ds^VP3;7- zYV8DR6VDtV3R2>d#4(5}Hz@zr6ZxS5h!mTIIQKq|-Mo@p%b=-WG=;7H*eW}QoFp8ZZGjyS_!3mk2MM>H(gZcXK5$P zke24EHQ`Ay<#eTEl*GLbF1=N`S(M6yrQ7uN8Uj^x!~5u zx|SFrGJER+#b;1f(?GG|(K=n5iqy2ehv(rd$JzR$i16QiOujVC0(PI|D_pmZh}J4oymaSqlyYSBgoC>wsmEC z{$!c;DwB-})oZm=dllPGWm0v^C9czq-h2)Vvu?HYvKF2;WgWhB$MdpP$y3=E)1R@4 zY_+P*zrV8+)hR)}sd+`$HcFLuhb`X%eb30MMY$aGB|PRzDm-yR?&Lrto0WSvP~t)| zR4bB5q+m$g54W~QYTg%?u}CO_Nnbp>*DIUMK|IeCl6Yz?m}?e$2a4`aD?o9-<#0U2 zhhb7Odku$^nI--742*T2{+|7cV+#Rw3}AI{4*`d$-9?(~A};8hvsP6Q56UNZw@)9V z%zJY2^pcor3g(u9Uz7c`T7t;@q^;Ls-6;nWXC$F(j@CkuUNZ8s^5SXDdM<;xzCfsG zUoP>3J(tjgrxE$7g`G_PAosO|SUYZERU>3TXy!w8V=$}8itA~j_${@niPZ|?f0E!Z~HMB-bhJfc{B8Y9cvG3 zYKh&4jZvVf%{M=o<4#TS?AFY*Yv!E(Ygs*hpEkXT$p%5MUcL3}2j{8nhRjducDiXq zX-Ge%gNiyY6~eUNq=VMrXp_1-qo;m(68~HAE9LVF8H-@4ckffUJY>x7JxF3gVzb|FPc!9pgDW zdKT}CzkF@$&D3e`B+>c)=P(2~f~X`XS+dR=Tt8hJCvswh*l$!DvjTHet!-<-+_W}zC8S{VO)Ctj!U5lpFGDNG`|G$ zJ4wX3IeW4$?PvbFm*>e{I@$TgmbY?8&&Z?FOeaBJ+ukgamf(B+d~~d;wuzTq(0VIc z2|ttUtdf8%GP+Qr7W$o9KxIw8ov#dt3Kp6;V7nG@?Yn`a96nL_y=CwTMwrxh)wP!} zwinETm{jYgv~Hp1+8n;KFCo=*c-9-dj1w7tr?s0qMk&G%PvJAzKY$3%ncan_RB)c& zFFk#O%mbd;RMLVq`noVdC1IrL`!K%&IJp#vV>D(lVv`k5iF4+1&c8#yq=aF@bC(}v zB=eXj#0b||c!qh7W~nd8Q2oXRmjhj+(dod3;0A-LFc(B#{bjcOgStGN}!D$dkL%~1HIygv@mi~WR^`6cu?zc=A!&1^{U+Z zNArA&GA#U4BAD<~vXGQoS|9m}{$hm;!=1i9(7gP`@tKL*X=W`*$gVd=lfVp|*6wuA z5j~SRO21b!3^;J0x8W$d}ZsopbnB6B!p$(rDG(|fGb&Ovc zsNGOm(nvV(M7Nyla|Tp=JMZ;!7Vtp@?2N|271^RA4R=Xpe=^qDouY+4_nz0hS~E%k zY2uqoED%LHXO0;a4M8w_m&RW%YZkxo$3j(N##&i-w+eu@DYn(Sx22D{a}NeDu+W({ zogNRlr2LIwE2~7l_V(30S>-fy_xSGTvCiowYJ1w~e4?zefHEB1G)Wa&@6W`zo@OwS zLbRl2qo7-jNT8D8_jHkNZY5)s7Qr5u$DgMx3Gezh+@V^Tixw&m6y4r>ZyG6Le3>eU zmrB7oLfL}3>f|*U>bHt7-SD zDWzpYIr}Mp#}qZTSr14}A!knPighEkhWHGwKerLegL|}3)hf?Q*xkb!X_J6o%GjHN;+dNf#B|$X`rF1xdWkHwf=Bh+^>}O^OWW#DA{UQ zY;8yu51)PjCn3~yT{rsTc}`jT>;duJitlr)LM23R?%8x-S}BA!ZVfAU$6A@w*a_G1 zG1S{~vX}o7bF6o6>P@rK9OthvIHUmLa=jx>VHEJ=gX=bz>QFO70x~k+pA@B|sfMG* zOLCZsfz?(+ijFr{LS4hm8aZ2tk*c+E0U}3Dt71VKlu)EnmpCCCo+saqutmK#E(JdG;zTSEN8N3y^%urer`ANpLU_jd#~r4HywR! zWreZclQ5Bowae{Es}G^bxmLA^uch!-kF7XT*TFHFUX-jomQMMj4$?- zhY?pSc(gJ1roURZ?uGJtM0R(xUmiw@!bb${sWYoXW)tnBC3<5kD$Q^f6MHJYKdM8p z-(IN-TG10Q`( z`7!`zm|?NC+CHVTIrhW+A&z_(cpo7(DX5s=g6llvQy+ztm(65&Fjsk^f^2VuGD#SR zcr(1V?JeWN+zqIJwdq#KNcM8HwXbxoa?k&iDVUe3n#*JF`Z38*3@7jA3ei~{^sY#x zPIr9UUCLH}+9L?ja0_*z-({th68cHXf1|aFlT3ZHHqqZ_jb7 z_cX}#$o zcRHr@{`%)x806{#Zb@cmlnlr?gs)~^9qAP~JQO$(j32(J6cptb5bAob-|<6AGi{~A zLJs0%Y5ui_JME226^dWRvtwfPvdh-|i%Xe~CZG;cFZD9-TpKhk|4w`*QRyVALXd!$ zmO`re>*`+W6;`GkUknh)t&rIj2-lNw&&4Vaim#O#ikJ|+*wgHhg)3RBvo10j7wsbm4^ig?@f#TA6%H#W?Cl!1Y8Hd6#|Qs@ zw-ZpMzvf%~j6Y|dkjr?J_#D3oUN_JXtx%V@khUK79uBz=>h{L^;Ox{j zOC^a0m0{Aw1MVxy_qEivwl!?Zr#>)}%^@n@5y;yge91Nw_FA+Da;EfayLtU5FnfJa z_~7v8g?HS{7e5!tJdXUomGnJ1-@=h;9rz<|(%K^BrP2jK=x3 zL^A`E%csO=DH!B3f8S)KFs-9MZ0fJwduu14LnFjIJ2#s%H<);5WGY|TYpfABBAH8i z$u;Ywi(|b~x&ps|h9FICb)%tDXsA=#^O-Dts(YjuWwbL6tP{NZ8pIgTk0oOmwA+ z+NkL4yBP&Bx?)h0Zb}J~?39e8_n&|xsM2{2>ID31)I|jSFrfw+eFQc7N-+R0vQquu zZTvXpDo%>~QsqoM4{zZr4S`K&qMN23)QWKdCwl3RyeXKL+Tr{maq{O-kKF(bwre zW-Lp~1&L1&WbJ8TZA-`i`AF#pQqpECy~K`Zc6r*F!)G8*n9LXW2H2~Mx>sMC)5394%G_6N9RNE$M&_}BTdQ2jB)QH`_g49)HD{}} z3tPc}{N;EPI{IegZwd2j_Q`V|d}bDW5w5m397AZIjbZ;`ATAis2FgQ0ds+zcI! zF*`e#WOC;#Rb$Pi8s1W~nYBD$BPMy+E2P`&GL(>eD{#B_L$1M_a*FQ|y^Z=4Z&*An z$|{3?%UD>T6toxcy+Pw+Z1BW8gq`L@m81O5IPXBHt#T|@tbNr`W97zur0*Wt@@-wO_C_W9Y zNrY6HDUZsVz>dE@U+}^oGuXaPG*mozD5cn${Vc-QN!<7YeZkh;L^nfxegaXz>wNAget=4FQ@Yi`$InhX3nHz zN#!9OGK($vEEA4!MnprEAgt}gPl{8!ZZRSyhA?n($#w;zhAbkkyJ+p6tzsbxYMZ9* zusUzZ@jiP7jn@Dv!hLEisQP9%!(@CH&aAp|P|9AZHi^O>kB*M)xUTYX3skIm)JY$8 zaaY^l0`95QX#etqncxWCj|G8zFBg%O8$u1lgT`yq2Y~KtXgnO6+ZI;9-p`#}6fbwt|JyS6>~!Bt zuqbErUjV>}-(1fChMds|3V<3!R6`2jM8FeT9$weu)GBUX40z)WQryY#ax%R%%zkWo zye1LDv%|)ZloXxCWEYnLBmNYT*QCvQ` z@1iJN^mhe5QPpuqAj?7W3QnOelN`u~{R;gymy{#3v-OcG`)6mCZA;@}BLdsQBm?Cn zkMLS`JPZmySros;XP{F*9~%#vHw&5K$rD5fj2#JIgNo83=FxDB__`zFpg1 zD>O{W)4^_&-RoR6ZtIqJfKhM{2EdV4Lo;9|YoGbHW22dOPr3QsxhE8@OtXyUza%NnK_?%&K_2Wc>?E22x+;=hBG6LOSkYv1iS zuHWT4tBQa+!#aWq?Dm)t2%LQFpE~0v(VmITB$cUsP3T507Y%?(dySv|=T~}p`!lY~ z2;qPv250935)bf_>{lRltjIMnqYU|Ws=t}708^0G zZ&^Hm#x~Pxg$^D#c=kA-MJO(YWU%O9fCYpl@wOkkGBV(HN_#ujPxRLSkHJb?^T9`? zf2prF%q*v|)%1qWYOp+lKublShyWr1f~F!sOdbemLf)H3AMYKx?8|bc^%aJwq(q7t z2XIjEv3`msrwU4W(viAl>LI!Q!n`&3QeweZ3<&jpYdc;{0$edh$&dVlviZ$x9?3}J zsD$#Fp*f_V1adSUqLjFucEc-M74jfI1iT})01b35DZPjArC9ml5fq`Fo3!eG?i%^Q z?WZ@F(5Nk)A@EB2$6c%&FwX!(=cDzL;_a4xDxUksY&F(K&#})S_wx>e&?*}*vh)X~ zpzrkArQV6>Tv4V#CIA>+aQJ~&4Iv6(lD%hV%y9<_8v(z=j#w9gjnTnzCFk(9R_I(u zc97j=y&cB7Q<~yYAT2)+zB2XDEq(R6dyi8(1NeWK$B-T$oBtAz`Ya@||H&L1cjrUl zsxtwGk9N12p7 zBy}Q604w%y6z<-c3k|>5Z$6}s;IH}?w?M=BZy4vy({bBD!XR-zCVdMmogXHpeThR= zcpb2hw7_C_mDyFbk?R}dy|sh-1g+LEEk%ap{Jt~f_#VxCAh+R#h?F)$8=T|~w0{B^ z?*773WP0GI?QS(?Dn72%z|hH;medGdo&)xlZnXTa#7gST>R;vm=S2raw=)6e+O z*djdUP-sSoOrU6371`}+<~hFvFNdSd%+BJ2KaOo|mFst4R~ympi)wXeNOGGGBl`U4 zo-7q|TdkG5&anldc(RDcU~auRdBf8BMCOBCIE`x+P_e zQRWx)37sRwFIQwyvw`nk$Tu%*DzIx_tIrkW#!c3_yyh zRzDn1oUwa}BTzRc3+p4CnhA(IC+%f`MPG4|M1gfQiZgzwDa^ph}KGg&_jT z`;o@}01J{$L{|q)rM&dhibeh+a)smsT$Ki-z$;gyOmsH!iQ!8NekEh--+dIdTgjB_ zeplR5sA!{Y&_MVR29w4z0pa}z&^NC(Q-&x3<4;DK-}%M7I;&c9 zklbuHWl-YItsTHJ{>L{y1;7>wgJ(QrpGh2lv==U&^>G>q9#!sS#>1@TdaURvIbA( z^yV@#L17pbQ{H_;e^t_fuBzMBfDgi@$7dQdVreIJj^=6T`sP< z3}>vgsk#4oUEjsxV_5uG()_v)2N!Q9{fe^)e~>Om?bnL8MrU8!Ki$du?2YEk9k*vVEuv9-e&k{{tUkDQ*VlXoFKgO1?U) zogX#Hn@DOuS-8e3>deNU z_79D`i4%-b+4xLb*e80f?rtjIy)R_5e$lk2&Dv09pwzgi1x08+KFh6m9`KL9MxqPP z?3+JrDOvShH{tK0sS0`Re%T1>hWW%fn3u<3-G|W!4B)A!z5ifJvn9uWis*42E;>v7 z4Wl$ly}830?K*Sf0F&N{%L;_%8-%f%gq_VX+7d+U;*NOsi0$5!jAZ=62fz__}?YnE_wrLwtJU9;v&wTl;*h!K)ncGvr$ z;fySDkao7#`;?_jc9{0 zZ?_WwNa=vRH>zUK7sA`6A6UQqU%YX}@zwbw@IPqdBDrxSq&5tSb6tVZ0$+3>_7`WD z9ohb4N(Zn|-BuLHV5j44B*gZ@-KR-3B#7!;=CYs(++ZN*N0~n5xXpBuek1{+8Mb{JioQn3(FFW@IOtFny#k9N$aQ?_#aC}#{zPqU2B-N3Y9 zRV-dC3P6bdrgumjPZQ3f&v(8YLX>pwlKjF>G`YJOO&Gvj(OLt1WuVY8(#?M~;w5Fk ze0x(g(Bs?gPoM3OoV)bX_Pj*$A5K5mcra7F!@nmoyC`xMxtDvcA%~WpEh%3YS$+l} z$!_3etIz&9*`M8no52mgnz5gDohtHTc%z`_^0ECp+)8uTqC7tRAFZ7KJKe-^(1Tnh ztk3Xunzg}I{a^((1V@Nc%Dp!d2GKS}s@U^#{%-&>r%G$2num|so#kwqNGQ4x&QZ7} z*>4{6&yIe_&J4?hgqMsz<4eptWsHC>`?!w3lomNggvkAO{#fWWkid|PoquDhHR4&8 zjM##{P$DLdOynI}^X$~v`+@LEJqY3}sSd7OPYo>Vg`qU7$b^d;PF}FGUmX=J6hOG0 z;jxwI^YFGgpGDR!`|O5B2YV%bkI|QthTt@8sJNPR_@F$_qDKRpW$C4?2^?7dN{Rtc zj9*{V78W0NKl!2=6En~!*8Km$kOqy>BD3-uZc0e7;ENV5oA{kdT05`gsryBe-q=bX zg4!@ji)P}LNh(JfpF`_=&Mgvet}|c6es%rzizBphdFHxqV&?cPjLf27jd~a!Qel~osr@^iWQXskkb?Yd6PyS&7%taOC z7GFaDobOMDl^7<>CNA5lmB3rsn;|5e&E1n*%K~R+R{Wg3#O~OcRu!<9XxzKQYn0)Qt1zu;#>w+5J@~;s%;63x*Kv|A{>iGiVwtSum|FyL~+&#gcz4^rh**X;-o4wi3Y^oF|QIeOYd{Y^A^9HGTV^pmwcxnXx{vV!7uHvSaEJKSW=$2h)e~6keqcs+1aoq;gG+mZ-Og}#g(h&RWuZgKYr>f@ z4oy-Sazv~gy=6`Nav5w^&)1&Twm(&oFAW57q%6VM`}BB;O!$T@ptcOpOk(sBnY4&C znz0}#^6&eMNBJe8!?kUce8H7*(O0hcNxRM8`t0QLOnM(BMYkgRY+L&Xb=dpvlW!0tF4ZQr|8ix@ay!}Zz;IfKGe6R*AqlM4UR@;Dod;*{C}%X4 z*GagYz4Hp!IZw9uBwmEdM5$iFxCeh8(`E_T%5%sI+YMr=G-K#7P8Rfy`Xxq1PHv+d z+a0Te>%Fif*I%IdoS}bPDZ{9+YT!oB{=;5(Dq*if>jYA>TLu?lLtpif`+_?XC|TW( zP_e#O>O-z)*6`L)Zwqd4vE`G~&rh<+6oAdL+fj=)TZuGli_eL!USF)vfWuj;=*!wq z?j}px7Yt1^u_|7mWUZw0&fJ~Yft}==_a&z8 zAm}bBun0Ijmw*&Vh3R^+>+PxQo-x9*{_OY!|Dxbz_pw${)fADB7@Vi$F34sU8gF%m zB-&FU1*PAnK)(EOCCKZ=MzhSJnW$t6$MGpg`npF?my#`gL}ooLehyn?$f*Yx1vmVw zG(eJk`*84G5-7V21cU}m3m|HB2==-*m_FYvN(P*>YwT4y(b9ZX zMbX~4w89nfvu_T-hF9%Qm5FQ+&qI~P1N|Uc2FUWnM!t6NT6kGAVFOCcbB4oxL-qw!z zw0lf4O~>=n|F(7Ndq-`C%g7~p4fg2oap_apALtfNNy*@{Z@a`{ahQ_m*c-i9MPFoY=t$u)Stxi09-l8gbkqPs zXp#Z^RbCutgiKS)*edL`D`~SO7(Yc!c8#-dvjU5F?Wg%)>*H`=1#%c}7@$wVMyiwt zHl(rT%bApe?lIW(QxjIL(RWQl62);}0nq0&X?Ybv+6|trPm|Yi^f-rm0i&LUP2}4n zxH!|WxReaTRy)oh4yO_Q)Two`f*XQUVdOk-_1GzrMaZ}Nhru$_64@C0u-*2*7AUCc zHyA4+y&lAckyvx| z)29hd1KBJ6o>vnfA+k7M;JVVX#!&jyoG(|Q2Qw!7H~pg)y8->V1%&A(H&`x*Z0SYJ zn^BL)P_IAR(98uR?x^=m0Fz=sRm%Y1nid0}5x*k48L^qtg1JD5ODf)O@N8zG z>%E!}yf#~~-*~cPw}v#}3rB+#vtbvH)4j@a!LHnL#sv(erLqw}e|xd|9(Ks!)qw9o zl<7u-!9$SeHvD+6cN-8+9_$L3G$aYghf^8S?`Er#E}%yTK98m(C11Q3Xz$Rw6URaG zAIf(yh~5{jO1-DKDB$9mjpz%7M+b*^F$MCDVHmfB_cy~^`eg8ziIO7uvtQmVE42`kNuI$uBku@Z{A&gy;t;mvP z?AypPW8aPKK1N-i$8~+b_x<~Qe~-ug`>SQlIp=xK={%3){eHflhYb0svr3p4u{y(# z`C>$njY2OSlad*pVcRO_;wH%M97sE~MT?BPJDgJRRu zz|axiOu=HkMuQLHXQK9|iA51tIaFf{tXU3L2MjWzVdXR*`X{&u#h5!#RGsU$fajBl zIEz~}jpfyrfPoF8Kkl{-Vy*dAi`(T&OU4KAp>5Z5w|JD*AKaLW8QsxCH|AA_pyZ_X z-DE-j{N}ZW9<51{VFM7d0_C`SWTMQj<7)Yjf^uTQzA`({d|t#*2f1WFbx#? zIyLFd?L~YKSf>9{d0_EFCw?rCANi0t8zQWzi(HG@nUcMweocIQ^Sfh35QKESP1IMS zNqTNiy*HrH$9xb%X(*EnM#atc{=b{ zrNeH;pLedio~_F6-}@XX;n-R5lKCv`*7n?2{!iD6@i6WiH~4gwBbNCXFBE<+%197X zRQY5Z#pfVlBD_#76Ns-bR&}+nHxOKuC}piW=sf0m=QYG2P5%$Tppv1pkC(lE^~28^}D9VpHJ|39xgi+d5wv!YDcz0|4XKKp0Y2 zHNQ~$sd|pBFd6C6R zcmT{vPz`pmSM99Uc2z*v1qxtJmElO&LxfHs7F-*)%$aIbgnC}rXNKp-EFkjc=12gP z?ZI?U?t$MVCkN4~HZVwcG@U&Be&Qs>bXUj7egwDjAk*-z$ zY!m5Tygk~qD2Q#UnIl!?TAok|w@K1XPQ9P9dPA1-bai4;pJh4F`D@^4ZfT}nUq%mf zX@DB{!1H6oj6`-ZB-`wN2kdomU3j{u(&Ne(9!htCN^t1Id#|gTK$j$hb!yO-ioTeC zT|Y$O%q9_`F{5qoHR&fhLpG?A^dt<^Q&>0&eQnQ)^dmh}spMSpAC^QGl^MbHgZso{ z2$(9~N125^lLu|nfwd4o7lBY2vp-K|GsdMZ1cznOP81P%IwvmPM2hk3F&*rAwR+8w zk)1vw_BtmgOPS)3AWv*gHoTHWr`Yo~kJfb=^6l~~#ydH6xSUi$6i5Xxe?|++1x(bw zL)ZIhUkwN+QR_CyzeH%`_EOqvrZ&P$c^)=`(G*pR0otT=d|rCaRnr2StAk{%Jh zy(p|5b7j!I4bqe@s#!wnaHE~MH4Smnv*)TV41)~uE}UUf-DTml7Yc9!RAGOa*EREV3r_JzJy3%n+#zz?j$cB;^kIx& z6tUshS$3IhMw z+A2qgvB6UpK3KK-4b!=B&o$x3d2h`}Vkq4-EfhQRCh^P$p+{I#r|hiw!yL67{WlU# zX~a0A6HeXt^50}n>AKXhV55*j@MqIyK2%>#8Vk(-netN7BG#kwo__(jmN$Up&}* z?2FX(x1|)mun;<@;1eHx=Gv7O*?uLqb1H^hlf-IQe4(d}DzDEKhem}{_y)*|!@^bV zcJxFumjY4#vMjU?=7={PwBg)oJXP~Gz1;juTmiAE?fF%Y)z=|CuhDi`REvE3)uQU2 zjNwaTLpbaY{z6poNa%z6Wx`2_`>mS;r*I`s6?Y5fA52Ny$x#F4KM(+{f3GM0>59>r zuCh0%p*Ls3MHdpm;RreySe75`4@y$+d?a zLeQ3RdOtAWr4Q1E6?ZjIW@;+fU;A=lO<*EC&$>$Spx?7$M8Vj}Jm*Bx)PqT~1+^E; z(=ZBuDC@aDwpe5I2Hh=2K$vt>m_^VEKNZTM%30M$XNs7UH-4V@R0MS=kFv@0D_Q=^ zZCNx2Hq(l%2dg`y&gKXzY|(=;lQRHxm(>Z~9c6l$(cPf?y3@KV?*zw@&qPFWcI4Jr ziHWCWg@8M^u=<=$*e$p2S1E0>zAu^pGxidL3eQzf=;~h_%o9-$|al4n#VY7LkZ_AgW8yfRqO!9Nl zVk$eAvT8{As_NFG8e5M^%SvNb=X-u`j^4F#6K4Rb!Y-(>-kF=b7r1NK)7-8~T@_FoA`V!A;0wb-ylB|-^B*kc&Be-I3m!dtw`GX->GIR=;hWq^ zL7hfBUphCQ3{qi*h1=7v!3iVkvFq}sdq2Yj^b+!?he>b{gC(^emYTr!hOV2=yk6fx z`=Or-T_!ZkPN_1KIy^5h8=Dw!ZYT*2l-+B|ac%qxJJq!>(S+-CH)9NLlj7>O;@Y)W$izGWH28oK6^c|LNX|a@xhBbC5-3soY%i`(Klr--yPS9 z;1UX&XsE{I70EE%PT6i8OMChY&e{_*awgXPhhGTQJb`3+MK#ifqL zQTRn2;=T5(l8<+O=yhBG6k$N!n%Nk5MrcpDigxq0IUJLl;jp@rt_TR>9%v>>aON1W zFlzF*hGM1jF7cm*ayhCce$XVZ5pN|QiVn}KR+?+%#%ebksRkRW6kK+ay*Jy{OW=~# z^%Ohn*c!o&JrHt#Nw1uhT7u>}g_jq66us^9`9aGKo|Mt=8Y%)PYT`?Bx9s;L$p=Fx zE#AJ!mH9joOf^2SpJmTXkmf3o3}*3|NkX-r}tM;j!ODUolF`+g!0V-tc8U zs`j;q)oi5PY-h#6kMaKvR=jh)!$cs=bMIC%sb%18K@E;Im;V17xi}62t!J^Y-P%X4 z1ngr($)hSayOt|)Pj$&dp!{2IQ`kn3Aw2{{@U!!&1 z5LeZF)&1##6Q0-9W5|@gB(Xp))ZBPm`&gy&YE^Xf3j z4tP>Kq@P<^;7ypjj~n|b0rGN*fMp`*3a!a_9fk)4>U^Yp{)I1!w6d8j^lt0-XU|fS z3(Lo7+Sp3dv-(E=o0t(EyI2A2NEEv0Yhl2V_5hdviZK2WXuO>^!I$j$p=`lMQ6Rr! zaeJcAh6h9OGZyq@#9Vi3eBX|e0~7cCZ^zSN?FX%0b`fGvSiHbw#GqCQ4J?SJwV{v% zfV0?4K(u8R^D{!*y%&>1B1gasH^zG>vVrZ>f$^|BEh&#=zr2ucU$tXp4zMWn>?+24 z2i_3z7Gg}n{}vbBO15gbJ%;2{LG`h&G7>1p3?@zjXWQ+mxPqFtv((1FAjc}ww{Sw1 z6ik2jd%kg7i$KB13@^zZTh5x&{^x8_Fp#b_Wwd`$4s}sj>6!q9$|nK4tN|dnYuB5` z_y6s6EQhM*Co24`-04g%7qtk1RxMy@A`O$9o~;y4bn+kMNdq{^E`cIOq`hd2$M^ph zIo_U(dA8p_F&MdLgC6q3La^BoQVX-uGomZNI2PT{>m~yb6un%_v|nB}m7|Cz+@p|% zWUcm4_}d!ibC*g6o6l@N2Pb>0jc}l2JGfm2pwXTH{JKSuC}}k)$4hJI05FRb8(>3a zLfL;~8k1ja#b2J0j{;INaw^+oru>ONVDatrX1GppGBQDau7{Tbt_f!#UdgS7ZVN^wao z(p4Z;u`1)4%tiYz-GF73I`%iK_{?y04HS`Hh>Sb`2UcXi7%8Pd=2MkcEdyRt1z-XJ zeccT+gk}H5gW8Nu)+XZ}z3p{)(ArRC(zOvlqBb;r+C>5cP}=U<7Pkx~ce$KWx%tMT zUV~nvQR?*wh7i@TV~Nu33_z&@HBKDyG(7o}cfE4@2THL-)12S{skR zmTfGRLo;?P6vs;qTnGgHQc3h5fS(j#sX5dsx_@p(mbTyaXt^cKhWFlUFq<~6)(hDp z_b+$HCkeGxW1#y0UUCyLf2PY@M{gClTVyw?J+v~`@>|XbPY$e_4$(C3xGe6xZ@KZt znB8yVom%V_@nCis-?KKM80fRMM2~yiMZ@}~^H=N=)>#f&!4NK2fSn!M8G9WlAm>yl zW`*qeYBA&42;vu| z_$B)9|K)N8$Pl;!!HJh>43%VUhIZXtjXi?TZoA2m(wOm^XpM4}CJl;>_m zVB1UzU?7WQG$cmHqJ#2_hCQj1eB5u}?(Kq&y0|u5Wb3K^E#QK~i3Ag>hjbKvuQ)ut zS#;vU!D-=mWTEiNSYjN+;P?BcURB;b=4odkL{5l?V8$-}u>ug}Wt$ci!#%>)zqO68 z1Juty3XQ=>XT2@xfdUc{1K>n}Gva>)d|KK&7L_uy1M}1&17L|G}eY^hW_X=CTTzBR%2IW>`$lo9l@0j{Enm0IY=?EXXdd0-s;_b zmW@NQxi|Qi)-mp>apj4R3zgv_;|;1{%fg3S-Vry2#~PYr%hf@q@p0WDp}J7P3{9wI z;HD`6-dnSdt&A4S;TjJFC)00rMm4}NZZ4f?JnqH8tr%Do;!1d5 z3#>~#VB%i5FDZFcW}yDMxP<9UR|}$wep_#S`$dc0aZg#T`G6QdgSU5qE;s1Lpk9c! zh$+MFO69`v#b`>05T~zv`RP~#0w@$|fRoNnpB7k(sW_gW#RK`G`YPc5&shLaYDXZtHk)cl!A7nUZaecwo@*27q@zC zxHzqk@>q65m;gf{h(>l8yoM0yp{QX!HTHOa@W|~!#v>$+J9;VVysdWis@z@Lu9i=0 zNCB%|YGLTqx1A(m@3)&#K&Z;N7NVa34YL>U1x7{W@@IWUuUMw-AVZ4B)_~XD%@Nu< zyx1KcBV=7`ass;h6}$g_x8G~#{EwSUO%~MY9UqCWmA8RVB=}zB<~Mjt74PRN|47?C`}8HI-DrXb8NCUsRU^ zc{t>DB8D4+uZNowvb*2radfXMiEM9mA-v`AMw8#`KLg;U19til zaGbwyZd&UGY=jpaVJ3*ft4;EanGjU<)vCp@|B%y*i4Da%_yLigu@b5T!) zg4KbLG@{cIe<*d#Jng=K$VPS~SHFPu6p41MD=>rj!+YUheB))$4~J?;7{zmFDH06^ zr9FUbyg&BnGEl76ni#6FpGb#u3KCd4ErHz!ERxqX8UO;<^z%zC<>NP%0k6xjW8_EB&}w*IRh z{(&oQ$M0`tmUoEawJ$DuBxP6wX*ciU{xK zc&q)wQuJ@7xG^Va$x9qV_Yb3GJY`sf((S<{ddy9)5o|8u#8cK zR}CmY8sj;$BM$m&Mt^eN@DS%7{P-Mb_+Edo(Q8QEya^itAt{u{Ljw2UrwS;96x|3%CA_rCpCE#r}{pbIPc^&^f+8MYuMvMq~R)88zy=)fNe zI0cBedmk->eQ~j>+R662NiTC}s7W3^{I{6V%BR059_1PlN^j@)SD10ptB)i%GHfhnOM* znM?B@nBv;{i#ClzL{VS{bNLs6SO=W3H^*EVj#c#?(u+yprDOku6O|5%;#4Tyq7h?G zD%^^NW8KX2P^YOcK|bxSOWmFhFARhTM}iwC{MY;b#M{4c+=C*oc?JXQupC5HJfC13 zp;hK8WC0sCF!}hJYPNWD=-KS&nl_zvhkze}eSv_yT$j^kfrb)Smv(9vHU^LOK#l!6 zR_fKo1&Ny?oIiMY-d|OvL zYHW?N4b^#wPe0+*TbzW<>Y5+K)mMupkBmE+q@s_TkHjUqeHo3h_p{=;!L4jZ0HES{ zwB(CRPJ6&jD9x@uvhO{xjgAdI|82B7f*itg8UNu^(h`tBty3nXXw8YaGa(2^AiN)YP$3-Tn09 z?`qMvBdX!^q3G6r`fJsBLNpA9m~x#fE5L+k5^>eM8m+~0$74iphnr!akk< z=VJ@QidcV` z1Virw*&r@UmF4j{ylL{~RUW#}dA46&Hee4JedJfZH8Mefgq?z=S}5@6+7+;}J}^yT zs)Ge@j2rSvwb$)*?i5U}rO6o8-I?D#jSP=%NWU6pVp_1Q^k{ zG3TBs-)O*461aRDd5e2$%k#W@@4Al>C0vf>zH#NXuIt+)G@~(d0=CH<=I1=e62L+$ zZamtek+PmsYnDJqsXyI=2ee_1K z{@UjTU-Ngd;tYwY^{>3YIuu--@(*zO#Yt`u5lqa=v=I#@BJCUgef#z>D+ISgU&M4= zny2e#qL@YJ^MFJX54K8zqBNG*tBC>Mp$cE$$!sMxt|F*;$F; zkN?m&BA~gEG|^A$xcJQPcYXjE>WKhv<=p0;fKv$c0IV;WWYx3e8<#tWcb}sH=yX zh!ry(lG~Z89s^U9vc`9(qR}vR@QWa=QFjA?wlz{3DEeY}9zQNpD;dWqJ{#}G6J%Vr z*Lr#|!lH&J-DzWpA+gV+3nz5TXRP*%dcW0m78!!9x}Q6PAwk3}_l&YSGZ2RHEpis{ z`mEpK?&WoJPqdK#S+rUUB!1kbQ&c#->;^3}o}DmKKG9PI5B>i2YiWfUXRQQ*>?R{* zgDfnUWlFeCWSQ=;dJRJ#dK@1a__%W^cxFp}0$v<7&(45XHrOPJs1}$$Cu#bG(vlz zN_!UvChw%dQ8x|BGC=sriCkZexkk}6TBI9CP$9&|uaw0y%Y73uiAL81bs#()A=u6m z2<5grn2MsahTR|j_rf&Qj*<(pG4}BsBVcktEk6zJHT&bTE{JNhh^b3r3L=|9|FZRo>Uu# zfn{H?HVHQG{HJ@9b3pdUbleG~ejdjR9Q6b>h!5b#2v`vIp@WX9y~v2zjc1>h~te(J=spT;q|Z(2H^BLX7wKBohC|D|Oh2DP^u@ zZQsxr7$GhS4Y@4xUuj6iGbW6!88aGtns=1uBxgb_uJP?m_1(cB%8m zHCq$FR>+NPubHCTsxUCPEGy{v4g_73nsWe+*(?K+wUx?%L40i)p@8dinFwC}NKq`B zjO@>(wZLpWkT#=F0^3PnQwLPvioBClprHdFDeBM$KJVy>0tWd#a>L??2GVhLxM8|9 zS%M9$Ro?%Go(=a`gFnqw*D^}iK|5EdgIoyZVt zL`lhJGhe7@6R)DM0g5_Dt#;QkLe4GH|SE_GoAE> zQP7$9*;3Wq`uuFvb|sTSaexJF{86mpb1+D(ZIoxx(FFNBaF8I-E2QcQ$-FQjPwT=d zeK2>#TW8LFXK;G{>3*wd6Kf3j^2o$Vds*8NsoUehyQ!r-)tw8qG{%eO&JpySQQVeRAQ*2tKu15erx+ZHaiwtbthn`M3A|w1V5T`{- zI$cy5^^ASWFsU1i{B)M#7kZ?9-4qaHz}luHkp-q_UHasJYbjs1mr?eDQXF%Ny2(J7 zD9e&hjmm{>&mQ|u1Js4Bjb8%j-v=L|p)AHiv36oE@G%`63qYO!iwU{1E!G&Bq#qai zbXYy@d&?<3UNdkZ9U)Sw>XFa~nbTXZ{{|U-d(Nat%Bb%i{}X3^!WDG{P-vEnI{rX! zVYt8ifXzPm2t4`nAp8YY*elEnu5h)1faPci{EMl$xldgk1zbEM+vxwiKL6&8;T^@2 zO8J$8^wg6_sS&sPaXX;-5d!yG=eJPcp7L60x_lZ!ZtZR}f>6-zM#=5Cl4xOOF5f0{*x%bNz2EoEb-ziQ) ztt#|Q#KRZ3clu>XZy` zu{jMXqOfm=J03z{df{@=@;*=U^MTWZMS2npL~%pGN=YvH!jqFgp{ew&2RJO7q|NxN z9{rLN-o-0EK!T#$y%Zkrd4dJEa!ZDmt$$(xj?jK=oZp}i7Y;G!VtvD%tYYorQ!=hj zSh$|=fd952u9snPT5i0dU{n9O#Q5IGdZ#8lV{}D}f_56=Cv9ZEsI$9uTpl##f7S|w z8-wTRQMEgEqppwfy`Zlq?M~1tV;RvD2K|h;HIlwP8S^B};#TNKyQ?mBdP*lAvN`l< zq!8k5_5Nh=mv<-SrJEcvx&oAvPXorz-AY15ijkEM$}hIN8FEfxEd*u#N`ME*`%+cO z&B1P)y0d^OPq=Oo1`TrpkXW|l5!G*9Z0q!2e#)$WO=h4rGFbb%j{%w6xdvZi6p$TN z<+7oYR%aEyI^8tbi7TMxq@i3QvhyIzUZ2^qtb1mn&hoOi^Lh`4uWGee@P5inQ+FTT zJ0A40c$87iYn3;*BB-C9?Sa0#W+Y9@ zohY9l1RAA$5BV%m8xi5<#dvH)Bc?1+2#QqjgQRw{01I9BR0{8|A16JyDp+v9V1LR# z1HUT-rNwP#rb)hCnpWTM_;Bbklsn-kb++%$Cp5(-s>mO<%4+M6S@c3sRE_jE;duyP z^Z&dz*beb$YghD+f+VBA8e4!n(3WdloX8Hg3#`SFktsGVivnqfb6}JglFfKbWAFxR zQuC|n68n3IS2PSggsYLeRjjfRM)Inz39biCpKlGCTt$%A1|-wNCAH1pfHxz70v9ly z^zcQ~Xz3q57aWHn1dsJTf%7jiP_=O)1=RH7Yd2yps+K9rdrln4Xs~U4;Hp6uZU*sv6Go05sLZ_)Hn^-4?{i>JO}=AH zF(Q)sydz-MHUes(Eu&@v7)bUn0V*ey^WH^-zW7w^O25$`1yAzE?)Sg_b2(h9n`Hdh zgqHE8CH6>PQsdY#Z%0Oy5mHfct^on$iAgIz>;CCER6_X;1CEvRVAIrj=(<0&wG7<* zZ4Uxa*=tz?#r6zQlK(;{3yR*2t$DwnKpaPkhmCLX!Em$OkGvjD)upwK{>V5ZUACWl zzh%RD(}$Gy{a|35>F2su2X0hLfi`L2i59RPZlC9-IA1FO#TtAte;-BdmHL_3)#VSm z2gQ)SJL{0dC*GIRt8xGNP)P_2?yxFs&L$IZ$CreqRcc0xA3LHqE=g6K6>5JbDco*5^?rUvxkuG+0% z8mmA0$?n7rN{zVB$VX5#i2Ss3J>$)o_%9!Iu~sKE<|qroTop~7ui6JPhk?SdlZWhL zD-CXVCgS;wya$@|R!!p>PRmhT?mHNGytOfp8M(rFsw~534pg2`OR7Z5>)LWkn4vQI z+~=8cOCX3z4y>TAFS7DahO^1`jALNZ43y;V5#01i#TYH#At z>KQ_$jP}EO;W>6u8ZO2*s5+g=T6Oks_g*V$hQ2rPePzxzura@$=HwnxsAtP4J@%5O zg?+J$^EjqBAIR36n8lyB#rEnGr-VyLOFSA%JA_!B?*S5zr|B#j4B!p8QWHken2~1# zIJIx=k<{V+TuSpPMongef&(KP8GY)#-Ni-qdQ!_MFOJ3;P)iE@&X%^u{ZM_Je z+$K@&jQQ-^Dt*39Q2v@doT&oVu332?Hl2kt27%a zm5hlhKGNj6a!!k(i_+DQKEJaK6#pOJWO{thpPfK+9yVO+O6gXoavSpTRXj|3pgV1+9{!LgWbLeSZJy;}2)x61bx}=Sr zoXll#O$?`|&smCF>Mn54{-K+{ku6?xB}^yY&O!rH-;Ajm_Z3UZU(SMGky2J??99+J zN?4MR5bl-gGaP#|66;cnc;P<5QzDrsZs-~v^PcJfP&HI5D0H(=GEXaIKl-@9x} z#d0T+-;QaYz#~kT`_gx_-Alus#JU)sWTK#<&?&7g%%RJ^2^Noa%&fRH5b>S}DSk5g z$iRT2=F>KNAFNp~sZtIy#!{~lC?Xkhh+3+ho_x^qFym(hxfZM+%s~iVC_{`Ir#hkP zXGRiK$>fNQa(t~l=JO5!nA)iF`l^nF+ttcW4bA}J7MNs^{BfR2<%7`OXx2+1xwbC=|+ zd26rFb=8$sv&E~h>)I-Ob6-?zocxbZvMk5`+iwsPq&r{A1i&~c3pD%A1hFlKq~x=x zhF)+?!_TbBMt%9ewaWGX)g`n4hZ{3(is1G-KNAo;>J_{_9|QjAFEm$KKA`bCpAwQY UaKsI)NltZFS^akYO%uQW1=!Z~_y7O^ literal 20369 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ℜr;$VV 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 You can still access it from the menu: File > Import > Netlist... 3. Select the generated netlist file, likely `BlinkyExample/BlinkyExample.net` in whereever you ran your HDL script, then click Load and Test Netlist. It should load with no errors, but there may be some warnings about missing pins. + ![pcb_netlist_dialog.png](docs/kicad/pcb_netlist_dialog.png) > In KiCad 10, uncheck "Group footprints based on symbol group". @@ -48,6 +50,7 @@ For hierarchical loading and replication, you have a few options: 4. Click "Update PCB" to place the components on the board. Drop them anywhere for now. + ![pcb_initial.png](docs/kicad/pcb_initial.png) - This may give you error(s) about missing pins, which you can ignore. @@ -57,7 +60,6 @@ For hierarchical loading and replication, you have a few options: The switch, diode, LED, and LED capacitor are all part of a SwitchCell hierarchical sheet in the netlist, which allows the layout to be replicated for each switch. Start by arranging all the switch footprints in a grid. - This can be done by selecting all the switch footprints, then right-clicking and selecting Create From Selection > Create Array... Set the grid array size (here, 3x2 as consistent with the HDL parameters) and spacing (19.05mm typical for mechanical keyboard switch spacing). Set Item Source to Arrange selection (move the footprints, instead of creating new ones), and the Grid Position to Source items remain in place. @@ -70,6 +72,8 @@ You may need to swap components to get the right ordering. ![pcb_switcharray_ordered.png](docs/kicad/pcb_switcharray_ordered.png) +> You may also use external plugins to arrange the footprints. + Then, lay out a single switch cell, including the switch, diode, LED, LED capacitor, and traces. Here is an example layout: @@ -90,30 +94,64 @@ Group the switch cell footprints: select them, right click, Grouping > Group Ite ### Option 1: Sublayout Plugin 1. Enter into the switch cell footprint group you just created and select the switch. + ![pcb_switchcell_anchor.png](docs/kicad/pcb_switchcell_anchor.png) + The group defines the objects to replicate, while the selected footprint defines the _anchor footprint_, the matching component in the other sheets that other footprints are placed around. 2. Run the Sublayout plugin and select all the instances (bottom list box). + ![sublayout_selected.png](docs/kicad/sublayout_selected.png) + + The Sublayout plugin automatically detects all instances of the same hierarchical sheet (HDL block, by name) and lists them. + 3. Press Replicate, and the plugin will replicate the layout, including footprint positions, traces, and groupings. - ![pcb_switchmatrix_replicated.png](docs/kicad/pcb_switchmatrix_replicated.png) + ![pcb_switchmatrix_replicated.png](docs/kicad/pcb_switchmatrix_replicated.png) ### Option 2: KiCad Design Blocks _KiCad 10+ required._ 1. Open the Design Blocks panel: main menu > View > Panels > Design Blocks. + ![kicad_designblocks_empty.png](docs/kicad/kicad_designblocks_empty.png) +2. If you don't already have a testing library: create a new library. + Right click > New Library, and select a location for it. + + ![kicad_designblocks_newlibrary.png](docs/kicad/kicad_designblocks_newlibrary.png) +3. Select the switch cell footprint group, and save it. + Right click on the design blocks library, > Save Selection as Design Block... + + ![kicad_designblocks_save.png](docs/kicad/kicad_designblocks_save.png) + + It should show up as a new entry in the library: + + ![kicad_designblocks_switchcell.png](docs/kicad/kicad_designblocks_switchcell.png) +4. If you inspect the group properties of the reference layout (select group, `E` hotkey), you'll see the Library link. + This links the group to the design block. + + ![kicad_designblocks_refprop.png](docs/kicad/kicad_designblocks_refprop.png) +5. Group the other switch cells footprints (switches, diodes, LEDs, capacitors), one group per switch cell instance. + For each group, set the library link to the same as the reference group. + + ![kicad_designblocks_newgroup.png](docs/kicad/kicad_designblocks_newgroup.png) +6. To replicate: right-click the group and select Apply Design Block Layout. + + ![kicad_designblocks_replicate.png](docs/kicad/kicad_designblocks_replicate.png) + + > This may shift the position of footprints and you may need to reposition the group. +7. Move the switch cell groups into the right positions. ### Snaking The LEDs are connected in a snaking pattern, which means every other row reverses the LED connection order. -You may want to have a different switch cell for the odd rows, which flips the LED rotation. +You may want to have a different switch cell for the odd rows, which flips the LED rotation so data flows from right-to-left. -## Loading a Microcontroller Layout +## Loading a Stock Microcontroller Layout _The tutorial only covers using the Sublayout plugin._ -_It may be possible to create a design block library using KiCad 10+, but that is a more heavyweight flow and is not covered._ +_Some pre-routed blocks are provided in [examples/prerouted_blocks](examples/prerouted_blocks) which are Sublayout-compatible .kicad_pcb files._ + From fbf78829eebde2f26b9a07fe5c6b55567cd8805e Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 13:31:10 -0700 Subject: [PATCH 28/41] wip --- docs/kicad/pcb_stm32.png | Bin 0 -> 12244 bytes docs/kicad/sublayout_stm32.png | Bin 0 -> 12213 bytes getting_started_hierarchy_layout.md | 17 +++++++++++++++++ 3 files changed, 17 insertions(+) create mode 100644 docs/kicad/pcb_stm32.png create mode 100644 docs/kicad/sublayout_stm32.png diff --git a/docs/kicad/pcb_stm32.png b/docs/kicad/pcb_stm32.png new file mode 100644 index 0000000000000000000000000000000000000000..907ed62b34502067f96a025a7f6d79155b9f6e86 GIT binary patch literal 12244 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 literal 0 HcmV?d00001 diff --git a/getting_started_hierarchy_layout.md b/getting_started_hierarchy_layout.md index 486b3a327..f0ee510ac 100644 --- a/getting_started_hierarchy_layout.md +++ b/getting_started_hierarchy_layout.md @@ -154,4 +154,21 @@ You may want to have a different switch cell for the odd rows, which flips the L _The tutorial only covers using the Sublayout plugin._ _Some pre-routed blocks are provided in [examples/prerouted_blocks](examples/prerouted_blocks) which are Sublayout-compatible .kicad_pcb files._ +1. Select the STM32F103 footprint and run the Sublayout plugin. + ![sublayout_stm32.png](docs/kicad/sublayout_stm32.png) +2. Press Restore and select the pre-routed block, here [examples/prerouted_blocks/Stm32f103.kicad_pcb](examples/prerouted_blocks/Stm32f103.kicad_pcb) + It will complete with warnings about missing footprints (R3, the USB pullup resistor, and J2, the programming header) which are not included in the prerouted block. + However, it will place the rest of your components including the crystal oscillator. + + ![pcb_stm32.png](docs/kicad/pcb_stm32.png) + +> Footprints are positioned exactly as they appear in the prerouted block, even if they are different footprints (e.g., using 1206 instead of 0603, or choosing a different crystal package). +> The Sublayout plugin allows restoring a prerouted block with different footprints, but you will probably need to do some fix-up work. + + +## Finishing the Board + +With the switch matrix and microcontroller done, that's a huge chunk of the work of laying out this board. + +You will still need to place and route the USB connector (including the CC pulldown resistors for passive power delivery negotiation), programming header, voltage regulator, and debugging LED. From 90409e779435f0559e531d1e5135ccaa3fb1072b Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 13:39:36 -0700 Subject: [PATCH 29/41] Update getting_started_hierarchy_layout.md --- getting_started_hierarchy_layout.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/getting_started_hierarchy_layout.md b/getting_started_hierarchy_layout.md index f0ee510ac..6409ca9b7 100644 --- a/getting_started_hierarchy_layout.md +++ b/getting_started_hierarchy_layout.md @@ -26,7 +26,7 @@ For hierarchical loading and replication, you have a few options: - This tutorial does not cover this. - This seems brittle to other traces overlapping the placement rule area and does not seem grouping-aware. -> Replicate Layout, Save/Restore Layout, and HierarchicalPCB will **NOT work**. +> ⚠️ Replicate Layout, Save/Restore Layout, and HierarchicalPCB will **NOT work**. > These require and validate against schematic files, which are not generated in this HDL flow. @@ -40,7 +40,7 @@ For hierarchical loading and replication, you have a few options: ![pcb_netlist.png](docs/kicad/pcb_netlist.png) > If you launched the PCB Editor from a KiCad project, this will not be on the toolbar (you will have "Update PCB from Schematic" instead). > You can still access it from the menu: File > Import > Netlist... -3. Select the generated netlist file, likely `BlinkyExample/BlinkyExample.net` in whereever you ran your HDL script, then click Load and Test Netlist. +3. Select the generated netlist file, likely `BlinkyExample/BlinkyExample.net` in wherever you ran your HDL script, then click Load and Test Netlist. It should load with no errors, but there may be some warnings about missing pins. ![pcb_netlist_dialog.png](docs/kicad/pcb_netlist_dialog.png) @@ -60,8 +60,8 @@ For hierarchical loading and replication, you have a few options: The switch, diode, LED, and LED capacitor are all part of a SwitchCell hierarchical sheet in the netlist, which allows the layout to be replicated for each switch. Start by arranging all the switch footprints in a grid. -This can be done by selecting all the switch footprints, then right-clicking and selecting Create From Selection > Create Array... -Set the grid array size (here, 3x2 as consistent with the HDL parameters) and spacing (19.05mm typical for mechanical keyboard switch spacing). +This can be done by selecting all the switch footprints, then right-clicking and selecting Create from Selection > Create Array... +Set the grid array size (here, 2x3 as consistent with the HDL parameters) and spacing (19.05mm typical for mechanical keyboard switch spacing). Set Item Source to Arrange selection (move the footprints, instead of creating new ones), and the Grid Position to Source items remain in place. ![kicad_array.png](docs/kicad/kicad_array.png) @@ -153,11 +153,12 @@ You may want to have a different switch cell for the odd rows, which flips the L _The tutorial only covers using the Sublayout plugin._ _Some pre-routed blocks are provided in [examples/prerouted_blocks](examples/prerouted_blocks) which are Sublayout-compatible .kicad_pcb files._ +_You can open those files as boards to inspect the layout snippet._ 1. Select the STM32F103 footprint and run the Sublayout plugin. ![sublayout_stm32.png](docs/kicad/sublayout_stm32.png) -2. Press Restore and select the pre-routed block, here [examples/prerouted_blocks/Stm32f103.kicad_pcb](examples/prerouted_blocks/Stm32f103.kicad_pcb) +2. Press Restore and select the pre-routed block, here [examples/prerouted_blocks/Stm32f103.kicad_pcb](examples/prerouted_blocks/Stm32f103.kicad_pcb). It will complete with warnings about missing footprints (R3, the USB pullup resistor, and J2, the programming header) which are not included in the prerouted block. However, it will place the rest of your components including the crystal oscillator. @@ -165,6 +166,7 @@ _Some pre-routed blocks are provided in [examples/prerouted_blocks](examples/pre > Footprints are positioned exactly as they appear in the prerouted block, even if they are different footprints (e.g., using 1206 instead of 0603, or choosing a different crystal package). > The Sublayout plugin allows restoring a prerouted block with different footprints, but you will probably need to do some fix-up work. +> In this case, consider it as a first-pass layout. ## Finishing the Board From 932eb78d856854d3794d7978ef7c8843f87301d0 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 13:40:34 -0700 Subject: [PATCH 30/41] Update Stm32f103.kicad_pcb --- examples/prerouted_blocks/Stm32f103.kicad_pcb | 4984 +++++++++++++---- 1 file changed, 4003 insertions(+), 981 deletions(-) diff --git a/examples/prerouted_blocks/Stm32f103.kicad_pcb b/examples/prerouted_blocks/Stm32f103.kicad_pcb index eed2e2b42..f9cf707f2 100644 --- a/examples/prerouted_blocks/Stm32f103.kicad_pcb +++ b/examples/prerouted_blocks/Stm32f103.kicad_pcb @@ -1,982 +1,4004 @@ -(kicad_pcb (version 20221018) (generator pcbnew) - - (general - (thickness 1.6) - ) - - (paper "A4") - (layers - (0 "F.Cu" signal "Front") - (31 "B.Cu" signal "Back") - (34 "B.Paste" user) - (35 "F.Paste" user) - (36 "B.SilkS" user "B.Silkscreen") - (37 "F.SilkS" user "F.Silkscreen") - (38 "B.Mask" user) - (39 "F.Mask" user) - (41 "Cmts.User" user "User.Comments") - (44 "Edge.Cuts" user) - (45 "Margin" user) - (46 "B.CrtYd" user "B.Courtyard") - (47 "F.CrtYd" user "F.Courtyard") - (49 "F.Fab" user) - ) - - (setup - (stackup - (layer "F.SilkS" (type "Top Silk Screen")) - (layer "F.Paste" (type "Top Solder Paste")) - (layer "F.Mask" (type "Top Solder Mask") (thickness 0.01)) - (layer "F.Cu" (type "copper") (thickness 0.035)) - (layer "dielectric 1" (type "core") (thickness 1.51) (material "FR4") (epsilon_r 4.5) (loss_tangent 0.02)) - (layer "B.Cu" (type "copper") (thickness 0.035)) - (layer "B.Mask" (type "Bottom Solder Mask") (thickness 0.01)) - (layer "B.Paste" (type "Bottom Solder Paste")) - (layer "B.SilkS" (type "Bottom Silk Screen")) - (copper_finish "None") - (dielectric_constraints no) - ) - (pad_to_mask_clearance 0) - (aux_axis_origin 138 48) - (pcbplotparams - (layerselection 0x00010f0_ffffffff) - (plot_on_all_layers_selection 0x0000000_00000000) - (disableapertmacros false) - (usegerberextensions false) - (usegerberattributes false) - (usegerberadvancedattributes false) - (creategerberjobfile false) - (dashed_line_dash_ratio 12.000000) - (dashed_line_gap_ratio 3.000000) - (svgprecision 6) - (plotframeref false) - (viasonmask false) - (mode 1) - (useauxorigin false) - (hpglpennumber 1) - (hpglpenspeed 20) - (hpglpendiameter 15.000000) - (dxfpolygonmode true) - (dxfimperialunits true) - (dxfusepcbnewfont true) - (psnegative false) - (psa4output false) - (plotreference true) - (plotvalue true) - (plotinvisibletext false) - (sketchpadsonfab false) - (subtractmaskfromsilk false) - (outputformat 1) - (mirror false) - (drillshape 0) - (scaleselection 1) - (outputdirectory "gerbers") - ) - ) - - (net 0 "") - (net 1 "gnd") - (net 2 "v3v3") - (net 3 "mcu.adc.curr_1") - (net 4 "mcu.adc.curr_3") - (net 5 "mcu.adc.curr_2") - (net 6 "mcu.gpio.bldc_reset") - (net 7 "mcu.gpio.bldc_fault") - (net 8 "mcu.gpio.boost_pwm") - (net 9 "mcu.gpio.sw1") - (net 10 "mcu.gpio.pd_int") - (net 11 "mcu.swd.tdi") - (net 12 "mcu.gpio.buck_pwm") - (net 13 "mcu.adc.conv_sense") - (net 14 "mcu.gpio.rgb") - (net 15 "mcu.swd.swd.swo") - (net 16 "mcu.crystal.crystal.b") - (net 17 "usb_esd.usb.dm") - (net 18 "bldc_drv.ens.2") - (net 19 "bldc_drv.ins.1") - (net 20 "mcu.gpio.bldc_in_2") - (net 21 "mcu.gpio.bldc_in_3") - (net 22 "i2c.i2c.sda") - (net 23 "i2c_tp.io.scl") - (net 24 "usb.usb.dp") - (net 25 "bldc_drv.ens.1") - (net 26 "mcu.gpio.bldc_en_3") - (net 27 "mcu.swd.swd.swclk") - (net 28 "mcu.ic.swd.swdio") - (net 29 "mag.pins.2") - (net 30 "mcu.swd.swd.reset") - (net 31 "mcu.crystal.crystal.a") - - (footprint "Capacitor_SMD:C_0603_1608Metric" (layer "F.Cu") - (tstamp 16d0ea69-4b6e-4754-b9bd-f33dfcb41b96) - (at 141 84) - (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") - (tags "capacitor") - (property "Sheetfile" "electronics_abstract_parts.AbstractCrystal.OscillatorCrystal") - (property "Sheetname" "crystal") - (property "edg_part" "CL10C330JB8NNNC (Samsung Electro-Mechanics)") - (property "edg_path" "mcu.crystal.cap_a") - (property "edg_refdes" "C11") - (property "edg_short_path" "mcu.crystal.cap_a") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-00000c1b0303/00000000-0000-0000-0000-000005e701f5") - (attr smd) - (fp_text reference "C11" (at 3 0) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 7bb17158-0f7c-4030-8421-73a49e957c81) - ) - (fp_text value "C1663" (at 0 1.43) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 98bc2285-b41e-46dd-83e6-e3e614e849df) - ) - (fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab") - (effects (font (size 0.4 0.4) (thickness 0.06))) - (tstamp d18b4f43-06e7-4156-bf20-8cc9a44b24b1) - ) - (fp_line (start -0.14058 -0.51) (end 0.14058 -0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6873421e-736f-46f7-8d25-1524d2d45a73)) - (fp_line (start -0.14058 0.51) (end 0.14058 0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0d698820-1d9d-4e7c-a969-0a468b1fca3d)) - (fp_line (start -1.48 -0.73) (end 1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp c463a28a-0d0c-461c-babe-d76283986022)) - (fp_line (start -1.48 0.73) (end -1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 434c7f3d-83e3-4854-87e2-f1685dd8fcc1)) - (fp_line (start 1.48 -0.73) (end 1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp e8b841e2-5a41-487c-be61-b570ff9d41e1)) - (fp_line (start 1.48 0.73) (end -1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 1a5bfd75-e952-4239-8107-73565bacfab5)) - (fp_line (start -0.8 -0.4) (end 0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp a047eb71-e16d-403b-833a-94f9b473d9ef)) - (fp_line (start -0.8 0.4) (end -0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6d46551b-418c-474d-9c44-2f4be5beba6e)) - (fp_line (start 0.8 -0.4) (end 0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 5b05477e-4f2a-40ef-aaec-d5a845429719)) - (fp_line (start 0.8 0.4) (end -0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 35476de1-5e0a-4eeb-a171-62f6d2ec2f81)) - (pad "1" smd roundrect (at -0.775 0) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 31 "mcu.crystal.crystal.a") (tstamp 81fd4fdb-97b3-4588-90b6-76f9ac479bcb)) - (pad "2" smd roundrect (at 0.775 0) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp 0c9a7272-aabd-40c8-9440-19d2d86a4304)) - (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (footprint "Capacitor_SMD:C_0805_2012Metric" (layer "F.Cu") - (tstamp 35cb7aec-9df8-433f-89f0-84f67a29c313) - (at 133 82 -90) - (descr "Capacitor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf, https://docs.google.com/spreadsheets/d/1BsfQQcO9C6DZCsRaXUlFlo91Tg2WpOkGARC1WS5S8t0/edit?usp=sharing), generated with kicad-footprint-generator") - (tags "capacitor") - (property "Sheetfile" "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") - (property "Sheetname" "mcu") - (property "edg_part" "CL21A475KAQNNNE (Samsung Electro-Mechanics)") - (property "edg_path" "mcu.pwr_cap[0].cap") - (property "edg_refdes" "C5") - (property "edg_short_path" "mcu.pwr_cap[0]") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000168703d5") - (attr smd) - (fp_text reference "C5" (at -2.5 0 90) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp d8be7944-c310-42cb-a835-bd17e7089d24) - ) - (fp_text value "C1779" (at 0 1.68 90) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 4bfa8046-83b0-4974-a67e-cd9a3f7de9ee) - ) - (fp_text user "${REFERENCE}" (at 0 0 90) (layer "F.Fab") - (effects (font (size 0.5 0.5) (thickness 0.08))) - (tstamp b1804141-8e31-47d2-8733-cc242d534b70) - ) - (fp_line (start -0.261252 -0.735) (end 0.261252 -0.735) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 15a45565-4e6e-4e01-a7bc-9b7402a52483)) - (fp_line (start -0.261252 0.735) (end 0.261252 0.735) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7175902c-3980-45ad-81e1-a22879ef31e9)) - (fp_line (start -1.7 -0.98) (end 1.7 -0.98) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp b9a0e86b-5742-402c-a7a0-240662a56b4f)) - (fp_line (start -1.7 0.98) (end -1.7 -0.98) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 811fb607-df49-4f4b-b5c8-0fdbe78cc810)) - (fp_line (start 1.7 -0.98) (end 1.7 0.98) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 608fc29c-8f30-4f40-bdca-65d60a9f2260)) - (fp_line (start 1.7 0.98) (end -1.7 0.98) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 360c1896-ae9a-4f18-8255-c38b4cc6bd9e)) - (fp_line (start -1 -0.625) (end 1 -0.625) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 27b5b4b8-cf90-41ca-9f83-954f4626c40c)) - (fp_line (start -1 0.625) (end -1 -0.625) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 81db23d3-5a72-401e-8800-2120794055c2)) - (fp_line (start 1 -0.625) (end 1 0.625) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 1151e663-ec13-479f-87f1-81edad9a8ad7)) - (fp_line (start 1 0.625) (end -1 0.625) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f1a63b5d-5764-46a8-b6ec-ee43312ec122)) - (pad "1" smd roundrect (at -0.95 0 270) (size 1 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp d4dfac60-dea3-4e90-825d-d5e77960890b)) - (pad "2" smd roundrect (at 0.95 0 270) (size 1 1.45) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp de0f76cb-a0ec-45ab-bad6-e6181114718c)) - (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0805_2012Metric.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (footprint "Capacitor_SMD:C_0603_1608Metric" (layer "F.Cu") - (tstamp 3aebd714-3f82-40d7-9eb7-94051e6cb1bb) - (at 136 66 90) - (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") - (tags "capacitor") - (property "Sheetfile" "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") - (property "Sheetname" "mcu") - (property "edg_part" "CC0603KRX7R9BB104 (YAGEO)") - (property "edg_path" "mcu.pwr_cap[2].cap") - (property "edg_refdes" "C7") - (property "edg_short_path" "mcu.pwr_cap[2]") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000168b03d7") - (attr smd) - (fp_text reference "C7" (at -2.5 0 90) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 74e2d6ae-be9d-402d-add5-3152a5ed1a96) - ) - (fp_text value "C14663" (at 0 1.43 90) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 2143f65b-d262-450a-9066-2a499428d800) - ) - (fp_text user "${REFERENCE}" (at 0 0 90) (layer "F.Fab") - (effects (font (size 0.4 0.4) (thickness 0.06))) - (tstamp af681a5c-a3b4-4221-a030-fe925b75cbfa) - ) - (fp_line (start -0.14058 -0.51) (end 0.14058 -0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a108d7f4-1c14-47d4-a475-de91a5384d33)) - (fp_line (start -0.14058 0.51) (end 0.14058 0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 26705285-92d5-4093-ac61-1da4e50e7f3d)) - (fp_line (start -1.48 -0.73) (end 1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 9cdb7fec-4403-4a7f-ab08-5726d1755f30)) - (fp_line (start -1.48 0.73) (end -1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 1d0088a5-cc99-456d-95e7-4a5497b55590)) - (fp_line (start 1.48 -0.73) (end 1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 03f5e227-30b7-45c8-b149-213479eb5684)) - (fp_line (start 1.48 0.73) (end -1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 0ef27aad-d30a-438c-9c78-e9c781ff0f78)) - (fp_line (start -0.8 -0.4) (end 0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 445c991c-e66c-42b5-8a86-5204e9de79f1)) - (fp_line (start -0.8 0.4) (end -0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp a2bc3722-9209-43ce-bdfd-3efcc5f05131)) - (fp_line (start 0.8 -0.4) (end 0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 9e9562cf-c0c3-408e-919c-9bd55cd2e18f)) - (fp_line (start 0.8 0.4) (end -0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 5c42c7b3-3a63-4ccd-84f3-7b79e87b3a15)) - (pad "1" smd roundrect (at -0.775 0 90) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp b4b2dd8e-e2a4-4daa-8873-1b58fd9a0956)) - (pad "2" smd roundrect (at 0.775 0 90) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp bfc09661-ddc8-4dcb-a5c2-62ba9138f30e)) - (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (footprint "Capacitor_SMD:C_0603_1608Metric" (layer "F.Cu") - (tstamp 6a50108e-6aa3-43b3-a666-a97cf847ba8c) - (at 146 66 90) - (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") - (tags "capacitor") - (property "Sheetfile" "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") - (property "Sheetname" "mcu") - (property "edg_part" "CC0603KRX7R9BB104 (YAGEO)") - (property "edg_path" "mcu.pwr_cap[1].cap") - (property "edg_refdes" "C6") - (property "edg_short_path" "mcu.pwr_cap[1]") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000168903d6") - (attr smd) - (fp_text reference "C6" (at -2.5 0 90) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp c710593e-a531-40ba-9f5d-e33c0d762c13) - ) - (fp_text value "C14663" (at 0 1.43 90) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 94f2c6f9-043e-4de8-a977-4c1bded25bf9) - ) - (fp_text user "${REFERENCE}" (at 0 0 90) (layer "F.Fab") - (effects (font (size 0.4 0.4) (thickness 0.06))) - (tstamp 9b3eb0a2-75c7-42a3-bf86-4945f3b49f3f) - ) - (fp_line (start -0.14058 -0.51) (end 0.14058 -0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 191e2d8a-d66e-48b9-8891-54b8c41ac468)) - (fp_line (start -0.14058 0.51) (end 0.14058 0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 7fee9e37-ea3a-4ad5-a2df-16779d972f85)) - (fp_line (start -1.48 -0.73) (end 1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp f7da7ec0-c245-497e-be04-4b9109581e50)) - (fp_line (start -1.48 0.73) (end -1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 85459bb0-ee0c-4182-b4c9-0ed2e4018461)) - (fp_line (start 1.48 -0.73) (end 1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp a7d381a1-f9e8-4b01-aa69-4536d09ac9d4)) - (fp_line (start 1.48 0.73) (end -1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 92fb46c3-f133-4cfe-8dd0-8763a85b8e95)) - (fp_line (start -0.8 -0.4) (end 0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp bf357768-3a27-4582-a9eb-e3a4b17f4b7c)) - (fp_line (start -0.8 0.4) (end -0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp adf935f1-f515-44a5-9be6-a9cd1d09179b)) - (fp_line (start 0.8 -0.4) (end 0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 12a11b64-5ee1-4b41-8bcf-c2901b319232)) - (fp_line (start 0.8 0.4) (end -0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 2a38b4d0-1b56-4a1d-a902-30c947bdd5f3)) - (pad "1" smd roundrect (at -0.775 0 90) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp 3463d62c-cfe3-4866-9e70-3bdc9fe97be7)) - (pad "2" smd roundrect (at 0.775 0 90) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp aa31f544-ef98-43fc-be4a-561999c0923f)) - (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (footprint "Capacitor_SMD:C_0603_1608Metric" (layer "F.Cu") - (tstamp 6bae50ab-a422-454e-9931-57f8c30beb92) - (at 146 82 -90) - (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") - (tags "capacitor") - (property "Sheetfile" "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") - (property "Sheetname" "mcu") - (property "edg_part" "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))") - (property "edg_path" "mcu.vdda_cap_0.cap") - (property "edg_refdes" "C9") - (property "edg_short_path" "mcu.vdda_cap_0") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-000015dc03c2") - (attr smd) - (fp_text reference "C9" (at -2.5 0 90) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 3b06f427-3e4e-44f6-a58d-f326243aa2e8) - ) - (fp_text value "C57112" (at 0 1.43 90) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 815fda8c-18c7-4536-9e9e-20d9f416bd69) - ) - (fp_text user "${REFERENCE}" (at 0 0 90) (layer "F.Fab") - (effects (font (size 0.4 0.4) (thickness 0.06))) - (tstamp 92d25dc4-6e64-4951-b97d-ae53700d4889) - ) - (fp_line (start -0.14058 -0.51) (end 0.14058 -0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6cbec720-ed7e-4913-b326-61330d37918d)) - (fp_line (start -0.14058 0.51) (end 0.14058 0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 6f2639b2-46e3-4c3a-be52-7094d0fdda49)) - (fp_line (start -1.48 -0.73) (end 1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 564add34-091d-49fe-b110-c7e09582fc80)) - (fp_line (start -1.48 0.73) (end -1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp eebf4159-b18d-439f-979b-a797c96bf943)) - (fp_line (start 1.48 -0.73) (end 1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 42e6cde9-30a9-45f6-b7ce-63230c3cc687)) - (fp_line (start 1.48 0.73) (end -1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 1e070f16-069b-431b-aa9d-8f1c3e592b8c)) - (fp_line (start -0.8 -0.4) (end 0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp eb61094b-6358-4773-8ca5-e16403b3f8d2)) - (fp_line (start -0.8 0.4) (end -0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6b5218c2-b65e-4e06-affe-0e1b4f095f4c)) - (fp_line (start 0.8 -0.4) (end 0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 54af95af-ebb4-4f02-bf0b-220e6263207e)) - (fp_line (start 0.8 0.4) (end -0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ec66e4e9-cce3-4612-a0f2-a56d652bd6d4)) - (pad "1" smd roundrect (at -0.775 0 270) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp 98724b38-d4cb-4457-b15a-949b57e76bf6)) - (pad "2" smd roundrect (at 0.775 0 270) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp e6c7d1da-e9ea-408b-9b8e-8afac2dac2e5)) - (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (footprint "Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm" (layer "F.Cu") - (tstamp 90631ca6-e25f-42db-a019-809b283b9dce) - (at 141 87 -90) - (descr "SMD Crystal SERIES SMD3225/4 http://www.txccrystal.com/images/pdf/7m-accuracy.pdf, 3.2x2.5mm^2 package") - (tags "SMD SMT crystal") - (property "Sheetfile" "electronics_abstract_parts.AbstractCrystal.OscillatorCrystal") - (property "Sheetname" "crystal") - (property "edg_part" "X322512MSB4SI (Yangxing Tech)") - (property "edg_path" "mcu.crystal.package") - (property "edg_refdes" "X1") - (property "edg_short_path" "mcu.crystal.package") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-00000c1b0303/00000000-0000-0000-0000-00000b4e02cd") - (attr smd) - (fp_text reference "X1" (at 0 -2.45 -90) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 9a6a30d1-6033-435e-9ca9-9a16703a4df4) - ) - (fp_text value "C9002" (at 0 2.45 -90) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 7369295c-9e68-43c9-976e-b44850ce90d8) - ) - (fp_text user "${REFERENCE}" (at 0 0 -90) (layer "F.Fab") - (effects (font (size 0.7 0.7) (thickness 0.105))) - (tstamp 15cfb315-72ee-41b8-8d6a-c40dde4ef05b) - ) - (fp_line (start -2 -1.65) (end -2 1.65) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 37a56074-cdd6-4509-81ed-cd8edc4ea73a)) - (fp_line (start -2 1.65) (end 2 1.65) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp ba5ab1f2-8b67-4794-9c4b-5a392b14d154)) - (fp_line (start -2.1 -1.7) (end -2.1 1.7) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp dd3ca650-0334-4dbc-b606-9acdbd5a8d8b)) - (fp_line (start -2.1 1.7) (end 2.1 1.7) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 75063b83-1f05-4f3c-aeaf-a92b28dab66a)) - (fp_line (start 2.1 -1.7) (end -2.1 -1.7) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp fbc294ea-7ead-4de8-8629-c6e5138139bd)) - (fp_line (start 2.1 1.7) (end 2.1 -1.7) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 47d5592d-0948-4767-9f84-5fac5d7e8f95)) - (fp_line (start -1.6 -1.25) (end -1.6 1.25) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 93e054ba-b0c9-4464-8676-04f71c7b431e)) - (fp_line (start -1.6 0.25) (end -0.6 1.25) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 45229518-87dc-4696-b626-663dabbb98c5)) - (fp_line (start -1.6 1.25) (end 1.6 1.25) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 93fac30b-62e1-434d-8826-a2c8e7bd8ddf)) - (fp_line (start 1.6 -1.25) (end -1.6 -1.25) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7dfb2b61-35e1-4cd7-b9fd-9420209efbbb)) - (fp_line (start 1.6 1.25) (end 1.6 -1.25) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 0a9e70c6-bf76-481d-a780-03cf402d6b49)) - (pad "1" smd rect (at -1.1 0.85 270) (size 1.4 1.2) (layers "F.Cu" "F.Paste" "F.Mask") - (net 31 "mcu.crystal.crystal.a") (tstamp 5b76a7e8-d62e-46b8-a635-b0a9b0516e18)) - (pad "2" smd rect (at 1.1 0.85 270) (size 1.4 1.2) (layers "F.Cu" "F.Paste" "F.Mask") - (net 1 "gnd") (tstamp b508b1b8-e414-45ff-a1fe-a35d31e25cb1)) - (pad "3" smd rect (at 1.1 -0.85 270) (size 1.4 1.2) (layers "F.Cu" "F.Paste" "F.Mask") - (net 16 "mcu.crystal.crystal.b") (tstamp 5311968b-6975-464b-9f72-55b9b683f8ac)) - (pad "4" smd rect (at -1.1 -0.85 270) (size 1.4 1.2) (layers "F.Cu" "F.Paste" "F.Mask") - (net 1 "gnd") (tstamp 85e80086-0bdc-4c6f-9ce3-a78588515871)) - (model "${KICAD6_3DMODEL_DIR}/Crystal.3dshapes/Crystal_SMD_3225-4Pin_3.2x2.5mm.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (footprint "Capacitor_SMD:C_0603_1608Metric" (layer "F.Cu") - (tstamp 975166e4-7cf6-40c6-9998-9d220186e659) - (at 148 82 -90) - (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") - (tags "capacitor") - (property "Sheetfile" "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") - (property "Sheetname" "mcu") - (property "edg_part" "CL10A105KB8NNNC (Samsung Electro-Mechanics)") - (property "edg_path" "mcu.vdda_cap_1.cap") - (property "edg_refdes" "C10") - (property "edg_short_path" "mcu.vdda_cap_1") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-000015dd03c3") - (attr smd) - (fp_text reference "C10" (at -3 0 90) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 73d56008-da39-48a6-b4d8-3d8443a0cb60) - ) - (fp_text value "C15849" (at 0 1.43 90) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp e04174ff-a9ac-4eb3-aa77-57034f7e266f) - ) - (fp_text user "${REFERENCE}" (at 0 0 90) (layer "F.Fab") - (effects (font (size 0.4 0.4) (thickness 0.06))) - (tstamp b82a8312-94bb-4a0a-b79f-66849ad66559) - ) - (fp_line (start -0.14058 -0.51) (end 0.14058 -0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 57b5c31a-771d-4c3e-9376-ecdd665fbfcc)) - (fp_line (start -0.14058 0.51) (end 0.14058 0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8f3a4041-5000-49ff-95da-429b61453557)) - (fp_line (start -1.48 -0.73) (end 1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 2a4c13a8-1675-46ef-8b96-28ebb1a5d58d)) - (fp_line (start -1.48 0.73) (end -1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 87f3a5ae-e324-4baf-95bc-e783f61ab539)) - (fp_line (start 1.48 -0.73) (end 1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 8d5c1d0d-12c0-492a-b757-29e44213ff1f)) - (fp_line (start 1.48 0.73) (end -1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp ebe11735-5ea0-4092-9151-f3212c49e59d)) - (fp_line (start -0.8 -0.4) (end 0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp d3b998cf-a2cd-4f90-beeb-5d6f557e8b83)) - (fp_line (start -0.8 0.4) (end -0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7262ee22-9e57-46c7-956f-a3aa92864a96)) - (fp_line (start 0.8 -0.4) (end 0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 1ed6567b-63f0-4112-a2cb-1f7734be5f35)) - (fp_line (start 0.8 0.4) (end -0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 132d6795-7a00-432d-9930-1efcb7bb18a4)) - (pad "1" smd roundrect (at -0.775 0 270) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp b3afc816-d9b2-4c8c-b010-592ddbc16ffa)) - (pad "2" smd roundrect (at 0.775 0 270) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp 9304f30f-994c-4907-89b7-286fa333035f)) - (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (footprint "Capacitor_SMD:C_0603_1608Metric" (layer "F.Cu") - (tstamp 9a565ea9-18fc-466a-846e-b7432f1bfec8) - (at 141 82 180) - (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") - (tags "capacitor") - (property "Sheetfile" "electronics_abstract_parts.AbstractCrystal.OscillatorCrystal") - (property "Sheetname" "crystal") - (property "edg_part" "CL10C330JB8NNNC (Samsung Electro-Mechanics)") - (property "edg_path" "mcu.crystal.cap_b") - (property "edg_refdes" "C12") - (property "edg_short_path" "mcu.crystal.cap_b") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-00000c1b0303/00000000-0000-0000-0000-000005e801f6") - (attr smd) - (fp_text reference "C12" (at -3 0) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp fa7ce4b1-b6c6-4664-9fea-011f56104a22) - ) - (fp_text value "C1663" (at 0 1.43) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp aa2b6522-6ff2-438b-abc2-c0d32f12d497) - ) - (fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab") - (effects (font (size 0.4 0.4) (thickness 0.06))) - (tstamp a4f3a099-a1de-4f8f-92fd-3c23dd281daa) - ) - (fp_line (start -0.14058 -0.51) (end 0.14058 -0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp e26ce60b-dabf-4e54-9656-0d09c8745c39)) - (fp_line (start -0.14058 0.51) (end 0.14058 0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4818b550-1f3b-461b-ad1c-f35265e68a8b)) - (fp_line (start -1.48 -0.73) (end 1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 8e42fce0-f725-4b68-accd-11fd4304aeb3)) - (fp_line (start -1.48 0.73) (end -1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp fecd0c2d-1548-45db-96da-ac775a5fe559)) - (fp_line (start 1.48 -0.73) (end 1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp ad17f3ff-8b20-4687-a4bc-95b15fd64047)) - (fp_line (start 1.48 0.73) (end -1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp fedb447a-1f69-49a0-846c-e2dab2eb7a8b)) - (fp_line (start -0.8 -0.4) (end 0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 65da7d8a-5c41-4c1e-b434-e373befa0d82)) - (fp_line (start -0.8 0.4) (end -0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 6df4f9a5-c4c2-42f1-bc8f-16ecc0a19752)) - (fp_line (start 0.8 -0.4) (end 0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp eb879da0-fa14-4b03-aa2b-a94cce292047)) - (fp_line (start 0.8 0.4) (end -0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 7bae6cee-bcab-4422-9c93-82e5cd042ef7)) - (pad "1" smd roundrect (at -0.775 0 180) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 16 "mcu.crystal.crystal.b") (tstamp 1d1aaffb-9d0c-48f2-aacf-37abfa952f6b)) - (pad "2" smd roundrect (at 0.775 0 180) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp adad975c-2c75-43cb-a68e-6f014cee6976)) - (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (footprint "Capacitor_SMD:C_0603_1608Metric" (layer "F.Cu") - (tstamp 9f1560db-15dd-45d5-95d6-a2e616eb29e8) - (at 135 82 -90) - (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") - (tags "capacitor") - (property "Sheetfile" "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") - (property "Sheetname" "mcu") - (property "edg_part" "CC0603KRX7R9BB104 (YAGEO)") - (property "edg_path" "mcu.pwr_cap[3].cap") - (property "edg_refdes" "C8") - (property "edg_short_path" "mcu.pwr_cap[3]") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000168d03d8") - (attr smd) - (fp_text reference "C8" (at -2.5 0 90) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 3c170679-97ee-4f6e-9d8b-2b2289cee67b) - ) - (fp_text value "C14663" (at 0 1.43 90) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp da7cca78-ad4f-49b2-93e6-30da69e22ffa) - ) - (fp_text user "${REFERENCE}" (at 0 0 90) (layer "F.Fab") - (effects (font (size 0.4 0.4) (thickness 0.06))) - (tstamp 5b15b69a-ea68-417d-9af9-0d51c997a226) - ) - (fp_line (start -0.14058 -0.51) (end 0.14058 -0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp a9f9d173-096a-40dc-9e6f-fc960dedc8bd)) - (fp_line (start -0.14058 0.51) (end 0.14058 0.51) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 3a7c8ed8-5ded-4a1c-ac14-0bd0208f7daa)) - (fp_line (start -1.48 -0.73) (end 1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 8c84e01a-b9f5-4c24-938b-b0b9957b881f)) - (fp_line (start -1.48 0.73) (end -1.48 -0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 74f3c5e9-a070-44fd-8ad4-372d9e0912ef)) - (fp_line (start 1.48 -0.73) (end 1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 4cd074da-fb95-4843-bdb5-d2f55279d409)) - (fp_line (start 1.48 0.73) (end -1.48 0.73) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 108d8200-4977-4d49-9e5a-35424a7621f3)) - (fp_line (start -0.8 -0.4) (end 0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp de5f38d6-2d58-42b7-92a3-8709b87eb568)) - (fp_line (start -0.8 0.4) (end -0.8 -0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 9ef3052d-e69f-4629-9008-408abc6cdefe)) - (fp_line (start 0.8 -0.4) (end 0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 794943b7-48a6-4d41-a606-8079a765b3ec)) - (fp_line (start 0.8 0.4) (end -0.8 0.4) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp f180fc7a-3890-4814-9c62-a911a91d0c8d)) - (pad "1" smd roundrect (at -0.775 0 270) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp 632c4c34-c806-44c1-9098-0fd47609fd84)) - (pad "2" smd roundrect (at 0.775 0 270) (size 0.9 0.95) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp f17c1d6a-9c20-4bde-a2a4-3a16f712cd33)) - (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (footprint "Connector:Tag-Connect_TC2050-IDC-FP_2x05_P1.27mm_Vertical" (layer "F.Cu") - (tstamp d24cdbed-ee1c-4a08-9a39-31ea70d0cef7) - (at 141 58 180) - (descr "Tag-Connect programming header; http://www.tag-connect.com/Materials/TC2050-IDC-430%20Datasheet.pdf") - (tags "tag connect programming header pogo pins") - (property "Sheetfile" "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") - (property "Sheetname" "mcu") - (property "edg_part" "") - (property "edg_path" "mcu.swd") - (property "edg_refdes" "J2") - (property "edg_short_path" "mcu.swd") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-000002ae014f") - (attr exclude_from_pos_files) - (fp_text reference "J2" (at 0 2 180) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 5402c6f5-cb27-44ac-a54f-3fc7819e77ab) - ) - (fp_text value "" (at 0 -4.8) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp c2962c4e-38dc-4884-bac7-bb5377b238df) - ) - (fp_text user "KEEPOUT" (at 0 0) (layer "Cmts.User") - (effects (font (size 0.4 0.4) (thickness 0.07))) - (tstamp 60b4c290-2334-46e5-adfb-e6f7af3fbaf4) - ) - (fp_text user "${REFERENCE}" (at 0 0) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp ff8073f4-056a-41ab-8935-91c82c27d0fd) - ) - (fp_line (start -3.175 1.27) (end -3.175 0.635) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 85d6a4fa-ce0d-4048-a164-4d2c06bd49bd)) - (fp_line (start -2.54 1.27) (end -3.175 1.27) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp c34377d8-5968-4540-ae34-79fd07babe1d)) - (fp_line (start -5.5 -4.25) (end 4.75 -4.25) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp de1f6600-dc49-4b2a-986e-baa3fa8472f3)) - (fp_line (start -5.5 4.25) (end -5.5 -4.25) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 5e6eeba1-7075-417a-be2b-ad133749c0f9)) - (fp_line (start 4.75 -4.25) (end 4.75 4.25) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 858ff5fb-5a34-4756-82e4-abc1085324f9)) - (fp_line (start 4.75 4.25) (end -5.5 4.25) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp f095cc34-2369-4590-a63d-9535be055c52)) - (pad "" np_thru_hole circle (at -3.81 -2.54 180) (size 2.3749 2.3749) (drill 2.3749) (layers "*.Cu" "*.Mask") (tstamp 19a01d4a-7988-455f-aea6-22c90751a7ff)) - (pad "" np_thru_hole circle (at -3.81 0 180) (size 0.9906 0.9906) (drill 0.9906) (layers "*.Cu" "*.Mask") (tstamp 03c29b64-ad0b-4bf1-879a-94b5ae80e4e4)) - (pad "" np_thru_hole circle (at -3.81 2.54 180) (size 2.3749 2.3749) (drill 2.3749) (layers "*.Cu" "*.Mask") (tstamp ebd61935-4a31-4718-903d-6327bb4f0e57)) - (pad "" np_thru_hole circle (at 1.905 -2.54 180) (size 2.3749 2.3749) (drill 2.3749) (layers "*.Cu" "*.Mask") (tstamp 54f32dff-bf73-4a36-acf9-33144ca0936f)) - (pad "" np_thru_hole circle (at 1.905 2.54 180) (size 2.3749 2.3749) (drill 2.3749) (layers "*.Cu" "*.Mask") (tstamp d826d710-6d8f-40cf-a956-152caa95bf8a)) - (pad "" np_thru_hole circle (at 3.81 -1.016 180) (size 0.9906 0.9906) (drill 0.9906) (layers "*.Cu" "*.Mask") (tstamp b42db1d8-0c47-483c-8997-273e7c7b2b1b)) - (pad "" np_thru_hole circle (at 3.81 1.016 180) (size 0.9906 0.9906) (drill 0.9906) (layers "*.Cu" "*.Mask") (tstamp 357d5391-3474-4b71-b854-a1ff3db639e9)) - (pad "1" connect circle (at -2.54 0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") - (net 2 "v3v3") (tstamp 35eecd52-b456-4da1-94f3-ddb8eda6252b)) - (pad "2" connect circle (at -1.27 0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") - (net 1 "gnd") (tstamp 35675dc3-1501-403d-b11f-0803eda895f3)) - (pad "3" connect circle (at 0 0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") - (net 1 "gnd") (tstamp c128a11c-04ce-4b1f-9f1f-ac36515ea29d)) - (pad "4" connect circle (at 1.27 0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") (tstamp 0f923acb-b9ea-49ae-a0d4-5f6be818a9a6)) - (pad "5" connect circle (at 2.54 0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") - (net 1 "gnd") (tstamp 60e0837d-6219-4671-a4ee-6db2a01620cd)) - (pad "6" connect circle (at 2.54 -0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") - (net 30 "mcu.swd.swd.reset") (tstamp f07b0370-2668-4830-9f4a-dc380a49d8cb)) - (pad "7" connect circle (at 1.27 -0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") - (net 11 "mcu.swd.tdi") (tstamp f5fd1606-3bbc-4047-9314-ed061baa6c1d)) - (pad "8" connect circle (at 0 -0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") - (net 15 "mcu.swd.swd.swo") (tstamp a3b9a888-25c6-4d47-b19c-4e95d582472b)) - (pad "9" connect circle (at -1.27 -0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") - (net 27 "mcu.swd.swd.swclk") (tstamp e3e4c983-44cf-4a0a-a046-32a3ba7004ac)) - (pad "10" connect circle (at -2.54 -0.635 180) (size 0.7874 0.7874) (layers "F.Cu" "F.Mask") - (net 28 "mcu.ic.swd.swdio") (tstamp dba9ce69-21e9-4f74-8864-d99322472bc5)) - (zone (net 0) (net_name "") (layer "F.Cu") (tstamp 37150a3e-f00a-4f04-ba8a-86622f0b9a6e) (hatch full 0.508) - (connect_pads (clearance 0)) - (min_thickness 0.254) (filled_areas_thickness no) - (keepout (tracks allowed) (vias not_allowed) (pads allowed) (copperpour not_allowed) (footprints not_allowed)) - (fill (thermal_gap 0.508) (thermal_bridge_width 0.508)) - (polygon - (pts - (xy 143.54 57.365) - (xy 138.46 57.365) - (xy 138.46 58.635) - (xy 143.54 58.635) - ) - ) - ) - ) - - (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm" (layer "F.Cu") - (tstamp d5fdde7e-99d1-4a23-a830-676da53a3a31) - (at 141 74 90) - (descr "LQFP, 48 Pin (https://www.analog.com/media/en/technical-documentation/data-sheets/ltc2358-16.pdf), generated with kicad-footprint-generator ipc_gullwing_generator.py") - (tags "LQFP QFP") - (property "Sheetfile" "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") - (property "Sheetname" "mcu") - (property "edg_part" "STM32F103xxT6 (STMicroelectronics)") - (property "edg_path" "mcu.ic") - (property "edg_refdes" "U3") - (property "edg_short_path" "mcu.ic") - (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000013700cd") - (attr smd) - (fp_text reference "U3" (at 0 -5.85 90) (layer "F.SilkS") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp d019ddcf-dae2-4872-9f2b-c4642a9fb5a4) - ) - (fp_text value "C8734" (at 0 5.85 90) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 6f64cdaf-5a6b-4b22-a2cf-5aeb1c54c1d8) - ) - (fp_text user "${REFERENCE}" (at 0 0 90) (layer "F.Fab") - (effects (font (size 1 1) (thickness 0.15))) - (tstamp 6e28052c-c145-4731-84f9-30707b0229e7) - ) - (fp_line (start -3.61 -3.61) (end -3.61 -3.16) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 29273be9-ab38-4966-95e2-0d12d82a928e)) - (fp_line (start -3.61 -3.16) (end -4.9 -3.16) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp b13b1cb0-5a31-46be-8cbb-faea8ea1cac3)) - (fp_line (start -3.61 3.61) (end -3.61 3.16) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 8f0a0b09-0306-4133-8245-d6af19bd7df6)) - (fp_line (start -3.16 -3.61) (end -3.61 -3.61) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 0cf2ffb1-1263-4c3e-b3c6-f1bdbd864afa)) - (fp_line (start -3.16 3.61) (end -3.61 3.61) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp cdb5b0f8-ff7a-41e4-bee6-eb1505359820)) - (fp_line (start 3.16 -3.61) (end 3.61 -3.61) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 17608267-074f-4583-b077-bfc0d495838a)) - (fp_line (start 3.16 3.61) (end 3.61 3.61) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 1f87d628-66e3-4d9a-9c7f-1e7af57875ef)) - (fp_line (start 3.61 -3.61) (end 3.61 -3.16) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp cbffd746-07c0-49dd-98d2-bf594ba545f4)) - (fp_line (start 3.61 3.61) (end 3.61 3.16) - (stroke (width 0.12) (type solid)) (layer "F.SilkS") (tstamp 4f5e8f95-6331-4be3-b2d3-1cb817e84ee3)) - (fp_line (start -5.15 -3.15) (end -5.15 0) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 1ca0da5f-ffe2-4cd1-aada-ebca4ccffb9b)) - (fp_line (start -5.15 3.15) (end -5.15 0) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp b5e227a0-ab11-4e7b-8459-681883384857)) - (fp_line (start -3.75 -3.75) (end -3.75 -3.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 1213d7a3-f877-483f-8e5e-50459ea920a1)) - (fp_line (start -3.75 -3.15) (end -5.15 -3.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 22b2fdab-a45a-40aa-a46b-47868d6401a7)) - (fp_line (start -3.75 3.15) (end -5.15 3.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 8e01940a-7cc5-412c-b220-0fb93cc0f7a3)) - (fp_line (start -3.75 3.75) (end -3.75 3.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 993858dc-149e-46da-a99c-ec0bc2e117c6)) - (fp_line (start -3.15 -5.15) (end -3.15 -3.75) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 3ccd4646-716c-4495-ac5e-3f7146f8ee28)) - (fp_line (start -3.15 -3.75) (end -3.75 -3.75) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp ee2f3ac2-a51d-4dd9-8afe-a82f5b30d540)) - (fp_line (start -3.15 3.75) (end -3.75 3.75) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 7dde4c52-b9a5-4260-9618-929b9764767c)) - (fp_line (start -3.15 5.15) (end -3.15 3.75) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp f7307669-1eec-48a6-a003-b18b262f9966)) - (fp_line (start 0 -5.15) (end -3.15 -5.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 74e59f32-8155-4909-a945-17b8828931b8)) - (fp_line (start 0 -5.15) (end 3.15 -5.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 258777ee-9505-41e6-b27f-bb6214dd38c2)) - (fp_line (start 0 5.15) (end -3.15 5.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 79cfe0de-a420-4053-8fe6-e9254cecfcf5)) - (fp_line (start 0 5.15) (end 3.15 5.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 16faa268-610c-483b-beec-70ccf84e4912)) - (fp_line (start 3.15 -5.15) (end 3.15 -3.75) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp c9704ac4-7f19-4b50-bfea-673e2120034d)) - (fp_line (start 3.15 -3.75) (end 3.75 -3.75) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 2dc32cb6-ace0-42f3-803c-ff5248c03aa2)) - (fp_line (start 3.15 3.75) (end 3.75 3.75) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp b89c8af5-b834-4913-9c11-7483eb8c9792)) - (fp_line (start 3.15 5.15) (end 3.15 3.75) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 24daa533-7c9e-4a6d-959b-4c17650e3005)) - (fp_line (start 3.75 -3.75) (end 3.75 -3.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 9d1e12de-5254-41a3-b3bc-49d45c2e554f)) - (fp_line (start 3.75 -3.15) (end 5.15 -3.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp d5369598-cafa-4060-b8ac-427534aa4851)) - (fp_line (start 3.75 3.15) (end 5.15 3.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 87174331-4d62-48c1-904a-5a01c77dfbe0)) - (fp_line (start 3.75 3.75) (end 3.75 3.15) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp acbb7ea9-97a0-4129-b886-62b195c083cc)) - (fp_line (start 5.15 -3.15) (end 5.15 0) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp 631fd876-98c8-418f-a8c6-03e7211750a9)) - (fp_line (start 5.15 3.15) (end 5.15 0) - (stroke (width 0.05) (type solid)) (layer "F.CrtYd") (tstamp a5b93785-accd-47cb-850a-e3033a56bcfb)) - (fp_line (start -3.5 -2.5) (end -2.5 -3.5) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 984e84c6-6a7c-48cc-8486-76ed511014dd)) - (fp_line (start -3.5 3.5) (end -3.5 -2.5) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 43bf9cc2-d203-4a63-a188-138c5e6a96bc)) - (fp_line (start -2.5 -3.5) (end 3.5 -3.5) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 9d2f3b4e-f244-4dfd-892d-bcbf0e11a663)) - (fp_line (start 3.5 -3.5) (end 3.5 3.5) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp 78145cdd-d8f4-420b-8762-1d881f01878f)) - (fp_line (start 3.5 3.5) (end -3.5 3.5) - (stroke (width 0.1) (type solid)) (layer "F.Fab") (tstamp ec42d7d6-f914-4600-8546-2a3ae12cc231)) - (pad "1" smd roundrect (at -4.1625 -2.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp 96aa77a7-43ab-4235-9cb6-7ef934c6dfd2)) - (pad "2" smd roundrect (at -4.1625 -2.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 367748b3-8043-468a-800f-90eb4eab61ae)) - (pad "3" smd roundrect (at -4.1625 -1.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 014124ae-5fb6-4ff6-8f36-752883360c2f)) - (pad "4" smd roundrect (at -4.1625 -1.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 706b1d53-a4eb-4cac-9625-9faba85e9dfe)) - (pad "5" smd roundrect (at -4.1625 -0.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 31 "mcu.crystal.crystal.a") (tstamp c773a581-9b5e-45cb-a926-b19c03dc8f82)) - (pad "6" smd roundrect (at -4.1625 -0.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 16 "mcu.crystal.crystal.b") (tstamp 6e469894-98d3-4725-a3a4-d66c231002fa)) - (pad "7" smd roundrect (at -4.1625 0.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 30 "mcu.swd.swd.reset") (tstamp 1aaa0773-25f8-469d-a367-393c2c573ed0)) - (pad "8" smd roundrect (at -4.1625 0.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp f8d28925-d24e-4011-aa8e-451ef6c8434e)) - (pad "9" smd roundrect (at -4.1625 1.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp 4c6c972d-3181-41bc-bdaa-41e11dfbceb8)) - (pad "10" smd roundrect (at -4.1625 1.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 29 "mag.pins.2") (tstamp af71420f-455b-4867-ac3d-a57805c662e1)) - (pad "11" smd roundrect (at -4.1625 2.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 12 "mcu.gpio.buck_pwm") (tstamp d9a57817-5e75-48df-9902-6272c58d5ce6)) - (pad "12" smd roundrect (at -4.1625 2.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 8 "mcu.gpio.boost_pwm") (tstamp 95b362fe-411f-4c3c-a0a6-8bfb60de75ff)) - (pad "13" smd roundrect (at -2.75 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 13 "mcu.adc.conv_sense") (tstamp 75368005-040f-4ff6-bf73-3f6ead9c26bd)) - (pad "14" smd roundrect (at -2.25 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 5 "mcu.adc.curr_2") (tstamp d1be1e94-8b24-4770-b2ea-d5aaf55f9fd5)) - (pad "15" smd roundrect (at -1.75 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 3 "mcu.adc.curr_1") (tstamp ca4e8bf8-2b99-44e2-a858-a3174b5f033b)) - (pad "16" smd roundrect (at -1.25 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 4 "mcu.adc.curr_3") (tstamp 1c2bba14-48db-423d-806d-9578432b31fe)) - (pad "17" smd roundrect (at -0.75 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 19 "bldc_drv.ins.1") (tstamp d3d899de-ea42-4e5b-8a0e-1ce53012ad30)) - (pad "18" smd roundrect (at -0.25 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 25 "bldc_drv.ens.1") (tstamp f7dcd519-3952-4d73-a9dc-f4b33af36a76)) - (pad "19" smd roundrect (at 0.25 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 20 "mcu.gpio.bldc_in_2") (tstamp 711f293d-b1f9-404b-bbef-ae651fd02434)) - (pad "20" smd roundrect (at 0.75 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 18 "bldc_drv.ens.2") (tstamp b1b17019-9e7e-4f9b-b55b-3de2ccedab96)) - (pad "21" smd roundrect (at 1.25 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 21 "mcu.gpio.bldc_in_3") (tstamp 2678ea51-0a88-43d6-ba7f-999d4253d6c4)) - (pad "22" smd roundrect (at 1.75 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 26 "mcu.gpio.bldc_en_3") (tstamp 34ce9799-90a0-4d14-b3e0-c6f4c7247b06)) - (pad "23" smd roundrect (at 2.25 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp acdf3f13-a9d6-4368-9952-0b788e1a6f92)) - (pad "24" smd roundrect (at 2.75 4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp e2f2036a-5d62-4dce-b8b5-ba60ef768260)) - (pad "25" smd roundrect (at 4.1625 2.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 7 "mcu.gpio.bldc_fault") (tstamp 95f048c2-65ef-4a7a-bb24-607d38b17924)) - (pad "26" smd roundrect (at 4.1625 2.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 6 "mcu.gpio.bldc_reset") (tstamp 953c6948-33a5-4f10-9284-f734e458007f)) - (pad "27" smd roundrect (at 4.1625 1.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 486f2c09-033e-473b-ab16-a3a49d4ccd2c)) - (pad "28" smd roundrect (at 4.1625 1.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 766ce5a6-f413-4ce5-b295-493785ac1e5e)) - (pad "29" smd roundrect (at 4.1625 0.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 0f6be9f6-c07f-486d-989e-5363d8c8c8cf)) - (pad "30" smd roundrect (at 4.1625 0.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 5b0883a3-74b6-4624-b0ac-bcf28f1aca21)) - (pad "31" smd roundrect (at 4.1625 -0.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 82f6e6c0-80f1-4605-a459-412066dc00e8)) - (pad "32" smd roundrect (at 4.1625 -0.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 17 "usb_esd.usb.dm") (tstamp 7d1c239b-1e0a-405c-b3e8-fcfe6d9c68cf)) - (pad "33" smd roundrect (at 4.1625 -1.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 24 "usb.usb.dp") (tstamp 275f6b53-6c19-47cc-a380-dd1f6b19f5ba)) - (pad "34" smd roundrect (at 4.1625 -1.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 28 "mcu.ic.swd.swdio") (tstamp d2267ce7-27a0-4323-8ee4-edf4fee0fb32)) - (pad "35" smd roundrect (at 4.1625 -2.25 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp 6304bfb8-8088-47b2-b268-8c42dda4977a)) - (pad "36" smd roundrect (at 4.1625 -2.75 90) (size 1.475 0.3) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp ed8aadd5-794e-4c98-b408-9d1ce6b0042f)) - (pad "37" smd roundrect (at 2.75 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 27 "mcu.swd.swd.swclk") (tstamp 8c8574f3-6197-4d42-afcd-951cbbea49fb)) - (pad "38" smd roundrect (at 2.25 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 9 "mcu.gpio.sw1") (tstamp 94630d8a-4b7d-4c70-ab8a-50d9a0352e5d)) - (pad "39" smd roundrect (at 1.75 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 15 "mcu.swd.swd.swo") (tstamp 29103c59-8ce5-46dd-9e43-49119b9f9202)) - (pad "40" smd roundrect (at 1.25 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 14 "mcu.gpio.rgb") (tstamp fa9cc7bf-c7f5-45dc-8a51-d6fea1d4be1a)) - (pad "41" smd roundrect (at 0.75 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp 1d7c383e-b303-4276-b1ae-0473a3a7d933)) - (pad "42" smd roundrect (at 0.25 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 23 "i2c_tp.io.scl") (tstamp 0c7d622f-98c9-47fc-a230-266a7d42c29f)) - (pad "43" smd roundrect (at -0.25 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 22 "i2c.i2c.sda") (tstamp a3250968-71c2-4773-a98e-c01f90af4385)) - (pad "44" smd roundrect (at -0.75 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp 56c7eb5a-e878-482e-afc3-f04edc39be27)) - (pad "45" smd roundrect (at -1.25 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 10 "mcu.gpio.pd_int") (tstamp 62971e02-8fe8-428f-8d13-1152d681aeef)) - (pad "46" smd roundrect (at -1.75 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) (tstamp ad03fcdc-4174-47fa-8adf-59d545ff9482)) - (pad "47" smd roundrect (at -2.25 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 1 "gnd") (tstamp e8e8fa85-25a5-4185-8a32-9057d41f8cb4)) - (pad "48" smd roundrect (at -2.75 -4.1625 90) (size 0.3 1.475) (layers "F.Cu" "F.Paste" "F.Mask") (roundrect_rratio 0.25) - (net 2 "v3v3") (tstamp 0bc7eacd-aa40-4cbc-98dc-908cdb46c266)) - (model "${KICAD6_3DMODEL_DIR}/Package_QFP.3dshapes/LQFP-48_7x7mm_P0.5mm.wrl" - (offset (xyz 0 0 0)) - (scale (xyz 1 1 1)) - (rotate (xyz 0 0 0)) - ) - ) - - (segment (start 148 82.775) (end 146 82.775) (width 0.5) (layer "F.Cu") (net 1) (tstamp 068c8d2a-738c-4d78-9cc7-89015f99b1d9)) - (segment (start 140.225 82) (end 139.5 82) (width 0.2) (layer "F.Cu") (net 1) (tstamp 0877f30d-da22-4503-bc80-710e25164112)) - (segment (start 138.75 69.8375) (end 138.75 70.75) (width 0.2) (layer "F.Cu") (net 1) (tstamp 091011d4-33cb-41d2-aee9-6c9675a41ae5)) - (segment (start 136 65.225) (end 135.225 65.225) (width 0.5) (layer "F.Cu") (net 1) (tstamp 0f2f7f80-9d26-479b-8d26-8096c748e7d0)) - (segment (start 136.8375 76.25) (end 137.75 76.25) (width 0.2) (layer "F.Cu") (net 1) (tstamp 1396c729-7fb9-4cae-968b-9de9ff42b2d8)) - (segment (start 139.5 88.1) (end 139 87.6) (width 0.2) (layer "F.Cu") (net 1) (tstamp 19c93769-8d03-4e55-a9ad-236cb6368a70)) - (segment (start 134.05 82.95) (end 133 82.95) (width 0.5) (layer "F.Cu") (net 1) (tstamp 1f53b826-b639-4e4c-9184-44772226ffb0)) - (segment (start 146 65.225) (end 146.775 65.225) (width 0.5) (layer "F.Cu") (net 1) (tstamp 2134f188-1235-4268-9fe8-c720a554047f)) - (segment (start 137.75 76.25) (end 138.5 75.5) (width 0.2) (layer "F.Cu") (net 1) (tstamp 2efe80ca-cc94-431c-ab7f-13f0a1b1b1ef)) - (segment (start 144.25 71.75) (end 143.5 72.5) (width 0.2) (layer "F.Cu") (net 1) (tstamp 2ff69acc-60fb-4a01-99b2-852aef917832)) - (segment (start 146 82.775) (end 146.775 82.775) (width 0.5) (layer "F.Cu") (net 1) (tstamp 307a37e7-2984-40ff-a1e1-5ab509067e3b)) - (segment (start 139 87.6) (end 139 82.5) (width 0.2) (layer "F.Cu") (net 1) (tstamp 401ad00c-0775-469c-ad64-f78164ddffeb)) - (segment (start 141.85 84.075) (end 141.775 84) (width 0.2) (layer "F.Cu") (net 1) (tstamp 4f76b7ef-7465-421f-b35d-aaebfe681fa3)) - (segment (start 141.775 84) (end 142.5 84) (width 0.2) (layer "F.Cu") (net 1) (tstamp 58fd0018-a301-4c3b-9b41-d746ae45a444)) - (segment (start 135.225 65.225) (end 135 65) (width 0.5) (layer "F.Cu") (net 1) (tstamp 5d294bca-85d5-40ea-8e44-c49668dcbc18)) - (segment (start 139 82.5) (end 139.5 82) (width 0.2) (layer "F.Cu") (net 1) (tstamp 6ec08251-b217-4309-8077-d7f6dd7a4070)) - (segment (start 135 82.775) (end 134.225 82.775) (width 0.5) (layer "F.Cu") (net 1) (tstamp 77148fe3-b1bd-4f57-bb46-96bc59a5391d)) - (segment (start 146.775 65.225) (end 147 65) (width 0.5) (layer "F.Cu") (net 1) (tstamp 81fb6b63-3b00-43dc-bd3d-adba3ee0f2be)) - (segment (start 138.25 74.75) (end 138.5 74.5) (width 0.2) (layer "F.Cu") (net 1) (tstamp 87b65d94-0f61-454d-ad90-beadb9f2d86f)) - (segment (start 141.75 76.75) (end 142 76.5) (width 0.2) (layer "F.Cu") (net 1) (tstamp 89581a13-f3c5-4f4e-893f-a084b0fca244)) - (segment (start 141.85 85.9) (end 141.85 84.075) (width 0.2) (layer "F.Cu") (net 1) (tstamp 8d090ac7-dddd-42f5-ba80-6833dc8f2c1d)) - (segment (start 134.225 82.775) (end 134.05 82.95) (width 0.5) (layer "F.Cu") (net 1) (tstamp 945fbf96-3d29-4118-813e-dfe6fb865445)) - (segment (start 141.75 78.1625) (end 141.75 76.75) (width 0.2) (layer "F.Cu") (net 1) (tstamp 9e212324-aff4-432a-9845-d6eb5168ebf0)) - (segment (start 134.225 82.775) (end 134 83) (width 0.5) (layer "F.Cu") (net 1) (tstamp ae06492b-4e79-4841-977d-4918740ca329)) - (segment (start 145.1625 71.75) (end 144.25 71.75) (width 0.2) (layer "F.Cu") (net 1) (tstamp b8e01547-7812-4f79-9cad-3b035dfca399)) - (segment (start 136.8375 74.75) (end 138.25 74.75) (width 0.2) (layer "F.Cu") (net 1) (tstamp bc0f886b-76a2-4df5-8c43-c279fad61b62)) - (segment (start 146.775 82.775) (end 147 83) (width 0.5) (layer "F.Cu") (net 1) (tstamp dd32f3f1-d51b-4d1d-a6b4-b03474bb13dc)) - (segment (start 140.15 88.1) (end 139.5 88.1) (width 0.2) (layer "F.Cu") (net 1) (tstamp e4698f21-8a6a-4538-a0dc-b998a3018088)) - (segment (start 138.75 70.75) (end 139.5 71.5) (width 0.2) (layer "F.Cu") (net 1) (tstamp f6290150-8e73-4c9b-a6ec-46fbbf6e9681)) - (via (at 138.5 75.5) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp 14b6573f-ec08-43cf-828e-125b88a5eeaf)) - (via (at 135 65) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp 17551e9e-8f26-4689-8975-331dc0a6090b)) - (via (at 138.5 74.5) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp 1b407f5a-c04f-449c-8d4e-bade1c426861)) - (via (at 139.5 82) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp 1cdd4504-17e5-4073-a5de-8fbb4fe73ebe)) - (via (at 142 76.5) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp 2d293e82-5e2b-48a2-a326-469c72aed7b5)) - (via (at 134 83) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp 37b71817-aee7-4efc-8dc6-20ec8e00e102)) - (via (at 143.5 72.5) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp 48b646d9-6aef-418a-b7fc-84a6a5961ea1)) - (via (at 142.5 84) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp 93a74b95-f2fe-4a3e-b558-69d447127182)) - (via (at 147 83) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp c39e6290-115b-4f1d-ac9c-90623c4a1368)) - (via (at 147 65) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp d0107ef8-905b-4914-8db8-236458f4edb3)) - (via (at 139.5 71.5) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 1) (tstamp f73163c9-78f9-40b1-9f70-1ac8c5beaa58)) - (segment (start 143 76.5) (end 142.25 77.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 0068eae4-cc63-4c36-b213-95ce9f2d4603)) - (segment (start 138 77) (end 135 80) (width 0.2) (layer "F.Cu") (net 2) (tstamp 03c81079-5a62-4a46-aae9-f514827949fe)) - (segment (start 146 69) (end 144 71) (width 0.2) (layer "F.Cu") (net 2) (tstamp 09ebb47f-e4e2-4e75-944b-4d91d23d0729)) - (segment (start 138.25 77.25) (end 138 77) (width 0.2) (layer "F.Cu") (net 2) (tstamp 29f55f97-ef30-4bcb-b5ef-e1c1684f48cb)) - (segment (start 143.5 76.5) (end 138 71) (width 0.2) (layer "F.Cu") (net 2) (tstamp 3ed6fe64-65a4-49c4-8846-0d914629bf61)) - (segment (start 144 71) (end 138 77) (width 0.2) (layer "F.Cu") (net 2) (tstamp 49d9f0de-6b60-40c7-9ad3-460632f0798d)) - (segment (start 136.8375 76.75) (end 137.75 76.75) (width 0.2) (layer "F.Cu") (net 2) (tstamp 532ef4d8-d82a-4a5e-87c1-0c739bf17d26)) - (segment (start 143.5 76.5) (end 143 76.5) (width 0.2) (layer "F.Cu") (net 2) (tstamp 60f07ebf-1b48-4f76-8117-d1356e7c3ac7)) - (segment (start 144.25 71.25) (end 144 71) (width 0.2) (layer "F.Cu") (net 2) (tstamp 63af8ebf-e5da-4507-971a-8cca1206dbdb)) - (segment (start 146 78.857691) (end 146 81.225) (width 0.2) (layer "F.Cu") (net 2) (tstamp 665bfac7-375a-4bbb-a7f2-a8b812147dd7)) - (segment (start 142.25 77.25) (end 142.25 78.1625) (width 0.2) (layer "F.Cu") (net 2) (tstamp 67379501-3ba9-4298-bd68-66727e751b5e)) - (segment (start 146 66.775) (end 146 69) (width 0.2) (layer "F.Cu") (net 2) (tstamp 6bef903b-7b0c-431e-b8c9-e3fe904f2459)) - (segment (start 138 71) (end 136 69) (width 0.2) (layer "F.Cu") (net 2) (tstamp 6f184c36-248b-4ad4-9fb2-6769b68efb84)) - (segment (start 145.1625 71.25) (end 144.25 71.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 744b5831-9da5-4637-955f-6d339d0cf77b)) - (segment (start 135 81.225) (end 134.225 81.225) (width 0.5) (layer "F.Cu") (net 2) (tstamp 7c81ba76-763b-406a-befa-68201e6379ab)) - (segment (start 138.25 78.1625) (end 138.25 77.25) (width 0.2) (layer "F.Cu") (net 2) (tstamp 7fa826b3-43cf-4474-95fd-ceab95c474f5)) - (segment (start 148 81.225) (end 146 81.225) (width 0.5) (layer "F.Cu") (net 2) (tstamp 8ac0c51c-8727-4db0-96e6-523ce461b3e0)) - (segment (start 134.225 81.225) (end 134.05 81.05) (width 0.5) (layer "F.Cu") (net 2) (tstamp 9f918f89-b5f8-403a-bbcf-f95e345daa08)) - (segment (start 143.642309 76.5) (end 146 78.857691) (width 0.2) (layer "F.Cu") (net 2) (tstamp b31fe36f-83cf-4b1c-a6a8-e53bc62ca084)) - (segment (start 135 80) (end 135 81.225) (width 0.2) (layer "F.Cu") (net 2) (tstamp bfe6ab58-702e-4a85-b5ae-162531a5791d)) - (segment (start 136 66.775) (end 136 69) (width 0.2) (layer "F.Cu") (net 2) (tstamp ca6feaeb-1e5f-4d01-995d-d60b7f1ec6e4)) - (segment (start 137.75 76.75) (end 138 77) (width 0.2) (layer "F.Cu") (net 2) (tstamp ce173204-a5ac-4a11-8eb4-ef686bc5b916)) - (segment (start 138.25 70.75) (end 138 71) (width 0.2) (layer "F.Cu") (net 2) (tstamp d679d82d-9b39-4d98-b8b1-1f1c7ef2f37f)) - (segment (start 134.05 81.05) (end 133 81.05) (width 0.5) (layer "F.Cu") (net 2) (tstamp d86eb023-dd88-42c6-8738-79b7fde1b57f)) - (segment (start 138.25 69.8375) (end 138.25 70.75) (width 0.2) (layer "F.Cu") (net 2) (tstamp e78863de-2c7a-4909-bbbe-1f3581e019eb)) - (segment (start 143.5 76.5) (end 143.642309 76.5) (width 0.2) (layer "F.Cu") (net 2) (tstamp ed8bed9f-0d15-4f12-846d-e7eca28cc784)) - (via (at 143.5 76.5) (size 0.7) (drill 0.3) (layers "F.Cu" "B.Cu") (net 2) (tstamp 2062349f-97e9-4657-a553-8a3bae47fbaf)) - (via (at 135 78) (size 0.9) (drill 0.5) (layers "F.Cu" "B.Cu") (net 2) (tstamp 5ec538ec-e1ac-4ddd-8c8f-9330ece75b28)) - (segment (start 141.5 81) (end 141.5 80.5) (width 0.2) (layer "F.Cu") (net 16) (tstamp 572d1903-fa81-4a00-ae73-a605f9f3eb64)) - (segment (start 141.775 82) (end 141.775 82.725) (width 0.2) (layer "F.Cu") (net 16) (tstamp 6fc63ea0-037e-498a-a878-9808ab91bd67)) - (segment (start 140.75 79.75) (end 141.5 80.5) (width 0.2) (layer "F.Cu") (net 16) (tstamp 80ef314c-0e21-4a25-98a2-baef547c7d96)) - (segment (start 141.775 82.725) (end 141 83.5) (width 0.2) (layer "F.Cu") (net 16) (tstamp 9ddcb14a-4baa-409c-b0ba-8d1d48d51a32)) - (segment (start 141.775 81.275) (end 141.5 81) (width 0.2) (layer "F.Cu") (net 16) (tstamp a85a5b8f-0b80-40ce-9677-c4c3ac70d88f)) - (segment (start 141.775 82) (end 141.775 81.275) (width 0.2) (layer "F.Cu") (net 16) (tstamp b2648c58-3420-4e57-899e-eb6948ea23a1)) - (segment (start 140.75 78.1625) (end 140.75 79.75) (width 0.2) (layer "F.Cu") (net 16) (tstamp e38141b5-9c36-4dde-b5a7-8fb08cc685e5)) - (segment (start 141 87.25) (end 141.85 88.1) (width 0.2) (layer "F.Cu") (net 16) (tstamp f402f4be-c0d8-4ec9-93ac-b2ef498f2b01)) - (segment (start 141 83.5) (end 141 87.25) (width 0.2) (layer "F.Cu") (net 16) (tstamp f44f1bda-2e83-43d5-b028-0b41d317f4cc)) - (segment (start 140.25 78.1625) (end 140.25 79.75) (width 0.2) (layer "F.Cu") (net 31) (tstamp 0c252c82-d60c-45e5-8e3b-590f49676b7f)) - (segment (start 140.15 85.9) (end 140.15 84.075) (width 0.2) (layer "F.Cu") (net 31) (tstamp 11353363-f7ad-40ea-b9d5-d8388da7ecb0)) - (segment (start 140.15 84.075) (end 140.225 84) (width 0.2) (layer "F.Cu") (net 31) (tstamp 22456065-e204-43b6-8f5e-0c2e5e5b13dd)) - (segment (start 141 82.5) (end 141 80.5) (width 0.2) (layer "F.Cu") (net 31) (tstamp 3fc62bac-4d63-43e1-9881-e72edad01289)) - (segment (start 140.225 83.275) (end 141 82.5) (width 0.2) (layer "F.Cu") (net 31) (tstamp 561e7ac4-aa96-4c5b-8c6e-62a77a5e8a09)) - (segment (start 140.225 84) (end 140.225 83.275) (width 0.2) (layer "F.Cu") (net 31) (tstamp 7a2fc9bf-0b61-42b9-9152-fe5924acde61)) - (segment (start 140.25 79.75) (end 141 80.5) (width 0.2) (layer "F.Cu") (net 31) (tstamp 9e081e8f-72bd-4ab2-a9a9-7734ea26684b)) - +(kicad_pcb + (version 20240108) + (generator "pcbnew") + (generator_version "8.0") + (general + (thickness 1.6) + (legacy_teardrops no) + ) + (paper "A4") + (layers + (0 "F.Cu" signal "Front") + (31 "B.Cu" signal "Back") + (34 "B.Paste" user) + (35 "F.Paste" user) + (36 "B.SilkS" user "B.Silkscreen") + (37 "F.SilkS" user "F.Silkscreen") + (38 "B.Mask" user) + (39 "F.Mask" user) + (41 "Cmts.User" user "User.Comments") + (44 "Edge.Cuts" user) + (45 "Margin" user) + (46 "B.CrtYd" user "B.Courtyard") + (47 "F.CrtYd" user "F.Courtyard") + (49 "F.Fab" user) + ) + (setup + (stackup + (layer "F.SilkS" + (type "Top Silk Screen") + ) + (layer "F.Paste" + (type "Top Solder Paste") + ) + (layer "F.Mask" + (type "Top Solder Mask") + (thickness 0.01) + ) + (layer "F.Cu" + (type "copper") + (thickness 0.035) + ) + (layer "dielectric 1" + (type "core") + (thickness 1.51) + (material "FR4") + (epsilon_r 4.5) + (loss_tangent 0.02) + ) + (layer "B.Cu" + (type "copper") + (thickness 0.035) + ) + (layer "B.Mask" + (type "Bottom Solder Mask") + (thickness 0.01) + ) + (layer "B.Paste" + (type "Bottom Solder Paste") + ) + (layer "B.SilkS" + (type "Bottom Silk Screen") + ) + (copper_finish "None") + (dielectric_constraints no) + ) + (pad_to_mask_clearance 0) + (allow_soldermask_bridges_in_footprints no) + (aux_axis_origin 138 48) + (pcbplotparams + (layerselection 0x00010f0_ffffffff) + (plot_on_all_layers_selection 0x0000000_00000000) + (disableapertmacros no) + (usegerberextensions no) + (usegerberattributes no) + (usegerberadvancedattributes no) + (creategerberjobfile no) + (dashed_line_dash_ratio 12.000000) + (dashed_line_gap_ratio 3.000000) + (svgprecision 6) + (plotframeref no) + (viasonmask no) + (mode 1) + (useauxorigin no) + (hpglpennumber 1) + (hpglpenspeed 20) + (hpglpendiameter 15.000000) + (pdf_front_fp_property_popups yes) + (pdf_back_fp_property_popups yes) + (dxfpolygonmode yes) + (dxfimperialunits yes) + (dxfusepcbnewfont yes) + (psnegative no) + (psa4output no) + (plotreference yes) + (plotvalue yes) + (plotfptext yes) + (plotinvisibletext no) + (sketchpadsonfab no) + (subtractmaskfromsilk no) + (outputformat 1) + (mirror no) + (drillshape 0) + (scaleselection 1) + (outputdirectory "gerbers") + ) + ) + (net 0 "") + (net 1 "gnd") + (net 2 "v3v3") + (net 3 "mcu.adc.curr_1") + (net 4 "mcu.adc.curr_3") + (net 5 "mcu.adc.curr_2") + (net 6 "mcu.gpio.bldc_reset") + (net 7 "mcu.gpio.bldc_fault") + (net 8 "mcu.gpio.boost_pwm") + (net 9 "mcu.gpio.sw1") + (net 10 "mcu.gpio.pd_int") + (net 11 "mcu.gpio.buck_pwm") + (net 12 "mcu.adc.conv_sense") + (net 13 "mcu.gpio.rgb") + (net 14 "mcu.swd.swd.swo") + (net 15 "mcu.crystal.crystal.b") + (net 16 "usb_esd.usb.dm") + (net 17 "bldc_drv.ens.2") + (net 18 "bldc_drv.ins.1") + (net 19 "mcu.gpio.bldc_in_2") + (net 20 "mcu.gpio.bldc_in_3") + (net 21 "i2c.i2c.sda") + (net 22 "i2c_tp.io.scl") + (net 23 "usb.usb.dp") + (net 24 "bldc_drv.ens.1") + (net 25 "mcu.gpio.bldc_en_3") + (net 26 "mcu.swd.swd.swclk") + (net 27 "mcu.ic.swd.swdio") + (net 28 "mag.pins.2") + (net 29 "mcu.swd.swd.reset") + (net 30 "mcu.crystal.crystal.a") + (footprint "Capacitor_SMD:C_0603_1608Metric" + (layer "F.Cu") + (uuid "16d0ea69-4b6e-4754-b9bd-f33dfcb41b96") + (at 141 84) + (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C11" + (at 3 0 0) + (layer "F.SilkS") + (uuid "7bb17158-0f7c-4030-8421-73a49e957c81") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C1663" + (at 0 1.43 0) + (layer "F.Fab") + (uuid "98bc2285-b41e-46dd-83e6-e3e614e849df") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "00893962-7ae6-4442-afd9-d0769d89cedc") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "2f8b3159-0d7f-40e1-97e7-9ef452996fae") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "6935e9ab-5522-49c6-be5a-5b199528cc68") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "CL10C330JB8NNNC (Samsung Electro-Mechanics)" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "0fc87ec4-a829-4412-a447-1238c23c3708") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.crystal.cap_a" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "897be737-16d3-493e-a8bf-55151ee292d5") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "C11" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "2c0b7c70-bd8a-4200-a148-b7d4b3935d4b") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.crystal.cap_a" + (at 0 0 0) + (layer "F.Fab") + (hide yes) + (uuid "4ab06e38-3b12-4ee8-b7b5-cccc74280beb") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-00000c1b0303/00000000-0000-0000-0000-000005e701f5") + (sheetname "crystal") + (sheetfile "electronics_abstract_parts.AbstractCrystal.OscillatorCrystal") + (attr smd) + (fp_line + (start -0.14058 -0.51) + (end 0.14058 -0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "6873421e-736f-46f7-8d25-1524d2d45a73") + ) + (fp_line + (start -0.14058 0.51) + (end 0.14058 0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "0d698820-1d9d-4e7c-a969-0a468b1fca3d") + ) + (fp_line + (start -1.48 -0.73) + (end 1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "c463a28a-0d0c-461c-babe-d76283986022") + ) + (fp_line + (start -1.48 0.73) + (end -1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "434c7f3d-83e3-4854-87e2-f1685dd8fcc1") + ) + (fp_line + (start 1.48 -0.73) + (end 1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "e8b841e2-5a41-487c-be61-b570ff9d41e1") + ) + (fp_line + (start 1.48 0.73) + (end -1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "1a5bfd75-e952-4239-8107-73565bacfab5") + ) + (fp_line + (start -0.8 -0.4) + (end 0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "a047eb71-e16d-403b-833a-94f9b473d9ef") + ) + (fp_line + (start -0.8 0.4) + (end -0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "6d46551b-418c-474d-9c44-2f4be5beba6e") + ) + (fp_line + (start 0.8 -0.4) + (end 0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "5b05477e-4f2a-40ef-aaec-d5a845429719") + ) + (fp_line + (start 0.8 0.4) + (end -0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "35476de1-5e0a-4eeb-a171-62f6d2ec2f81") + ) + (fp_text user "${REFERENCE}" + (at 0 0 0) + (layer "F.Fab") + (uuid "d18b4f43-06e7-4156-bf20-8cc9a44b24b1") + (effects + (font + (size 0.4 0.4) + (thickness 0.06) + ) + ) + ) + (pad "1" smd roundrect + (at -0.775 0) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 30 "mcu.crystal.crystal.a") + (uuid "81fd4fdb-97b3-4588-90b6-76f9ac479bcb") + ) + (pad "2" smd roundrect + (at 0.775 0) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "0c9a7272-aabd-40c8-9440-19d2d86a4304") + ) + (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0805_2012Metric" + (layer "F.Cu") + (uuid "35cb7aec-9df8-433f-89f0-84f67a29c313") + (at 133 82 -90) + (descr "Capacitor SMD 0805 (2012 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf, https://docs.google.com/spreadsheets/d/1BsfQQcO9C6DZCsRaXUlFlo91Tg2WpOkGARC1WS5S8t0/edit?usp=sharing), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C5" + (at -2.5 0 90) + (layer "F.SilkS") + (uuid "d8be7944-c310-42cb-a835-bd17e7089d24") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C1779" + (at 0 1.68 90) + (layer "F.Fab") + (uuid "4bfa8046-83b0-4974-a67e-cd9a3f7de9ee") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "807afe86-001f-41ef-8bf1-4f2b54343d49") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "2e8931a2-061a-4ae4-a9d4-444dfe26f9dc") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "7bea6d05-c4d6-4979-ad20-51a4756789f8") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "CL21A475KAQNNNE (Samsung Electro-Mechanics)" + (at 51 215 0) + (layer "F.Fab") + (hide yes) + (uuid "34fad79e-545f-4ae8-bac6-358bce7ae6f3") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.pwr_cap[0].cap" + (at 51 215 0) + (layer "F.Fab") + (hide yes) + (uuid "9310f13b-f144-4aae-8978-3e55e4931cf4") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "C5" + (at 51 215 0) + (layer "F.Fab") + (hide yes) + (uuid "e6b2bed4-b4bb-435f-8abd-cd032b54ef2b") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.pwr_cap[0]" + (at 51 215 0) + (layer "F.Fab") + (hide yes) + (uuid "f7e8d8d3-5b44-4f2e-a8c7-2a47bfd1e3b6") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000168703d5") + (sheetname "mcu") + (sheetfile "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") + (attr smd) + (fp_line + (start -0.261252 0.735) + (end 0.261252 0.735) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "7175902c-3980-45ad-81e1-a22879ef31e9") + ) + (fp_line + (start -0.261252 -0.735) + (end 0.261252 -0.735) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "15a45565-4e6e-4e01-a7bc-9b7402a52483") + ) + (fp_line + (start -1.7 0.98) + (end -1.7 -0.98) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "811fb607-df49-4f4b-b5c8-0fdbe78cc810") + ) + (fp_line + (start 1.7 0.98) + (end -1.7 0.98) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "360c1896-ae9a-4f18-8255-c38b4cc6bd9e") + ) + (fp_line + (start -1.7 -0.98) + (end 1.7 -0.98) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "b9a0e86b-5742-402c-a7a0-240662a56b4f") + ) + (fp_line + (start 1.7 -0.98) + (end 1.7 0.98) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "608fc29c-8f30-4f40-bdca-65d60a9f2260") + ) + (fp_line + (start -1 0.625) + (end -1 -0.625) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "81db23d3-5a72-401e-8800-2120794055c2") + ) + (fp_line + (start 1 0.625) + (end -1 0.625) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "f1a63b5d-5764-46a8-b6ec-ee43312ec122") + ) + (fp_line + (start -1 -0.625) + (end 1 -0.625) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "27b5b4b8-cf90-41ca-9f83-954f4626c40c") + ) + (fp_line + (start 1 -0.625) + (end 1 0.625) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "1151e663-ec13-479f-87f1-81edad9a8ad7") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "b1804141-8e31-47d2-8733-cc242d534b70") + (effects + (font + (size 0.5 0.5) + (thickness 0.08) + ) + ) + ) + (pad "1" smd roundrect + (at -0.95 0 270) + (size 1 1.45) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "d4dfac60-dea3-4e90-825d-d5e77960890b") + ) + (pad "2" smd roundrect + (at 0.95 0 270) + (size 1 1.45) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "de0f76cb-a0ec-45ab-bad6-e6181114718c") + ) + (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0805_2012Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0603_1608Metric" + (layer "F.Cu") + (uuid "3aebd714-3f82-40d7-9eb7-94051e6cb1bb") + (at 136 66 90) + (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C7" + (at -2.5 0 90) + (layer "F.SilkS") + (uuid "74e2d6ae-be9d-402d-add5-3152a5ed1a96") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C14663" + (at 0 1.43 90) + (layer "F.Fab") + (uuid "2143f65b-d262-450a-9066-2a499428d800") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "a0d2a8d4-f165-4fc5-b99d-a2791d2646b0") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "90d801b6-aecc-441f-b7c1-7d5c97707de3") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "0502e111-541a-4d2e-b7db-2a32ba73ecf4") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "CC0603KRX7R9BB104 (YAGEO)" + (at 202 -70 0) + (layer "F.Fab") + (hide yes) + (uuid "22f3c462-4489-4525-b02f-774479b4ce7a") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.pwr_cap[2].cap" + (at 202 -70 0) + (layer "F.Fab") + (hide yes) + (uuid "1594ebc5-bdd7-42fd-a07a-1d8024586d86") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "C7" + (at 202 -70 0) + (layer "F.Fab") + (hide yes) + (uuid "51a2d415-d98e-46f6-80ef-0926d5783600") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.pwr_cap[2]" + (at 202 -70 0) + (layer "F.Fab") + (hide yes) + (uuid "6cf1bf2f-e684-4ccc-865d-caca3ae29208") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000168b03d7") + (sheetname "mcu") + (sheetfile "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") + (attr smd) + (fp_line + (start -0.14058 -0.51) + (end 0.14058 -0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "a108d7f4-1c14-47d4-a475-de91a5384d33") + ) + (fp_line + (start -0.14058 0.51) + (end 0.14058 0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "26705285-92d5-4093-ac61-1da4e50e7f3d") + ) + (fp_line + (start 1.48 -0.73) + (end 1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "03f5e227-30b7-45c8-b149-213479eb5684") + ) + (fp_line + (start -1.48 -0.73) + (end 1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "9cdb7fec-4403-4a7f-ab08-5726d1755f30") + ) + (fp_line + (start 1.48 0.73) + (end -1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "0ef27aad-d30a-438c-9c78-e9c781ff0f78") + ) + (fp_line + (start -1.48 0.73) + (end -1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "1d0088a5-cc99-456d-95e7-4a5497b55590") + ) + (fp_line + (start 0.8 -0.4) + (end 0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "9e9562cf-c0c3-408e-919c-9bd55cd2e18f") + ) + (fp_line + (start -0.8 -0.4) + (end 0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "445c991c-e66c-42b5-8a86-5204e9de79f1") + ) + (fp_line + (start 0.8 0.4) + (end -0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "5c42c7b3-3a63-4ccd-84f3-7b79e87b3a15") + ) + (fp_line + (start -0.8 0.4) + (end -0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "a2bc3722-9209-43ce-bdfd-3efcc5f05131") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "af681a5c-a3b4-4221-a030-fe925b75cbfa") + (effects + (font + (size 0.4 0.4) + (thickness 0.06) + ) + ) + ) + (pad "1" smd roundrect + (at -0.775 0 90) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "b4b2dd8e-e2a4-4daa-8873-1b58fd9a0956") + ) + (pad "2" smd roundrect + (at 0.775 0 90) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "bfc09661-ddc8-4dcb-a5c2-62ba9138f30e") + ) + (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0603_1608Metric" + (layer "F.Cu") + (uuid "6a50108e-6aa3-43b3-a666-a97cf847ba8c") + (at 146 66 90) + (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C6" + (at -2.5 0 90) + (layer "F.SilkS") + (uuid "c710593e-a531-40ba-9f5d-e33c0d762c13") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C14663" + (at 0 1.43 90) + (layer "F.Fab") + (uuid "94f2c6f9-043e-4de8-a977-4c1bded25bf9") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "b839f137-158b-4788-97c1-3665b7034391") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "0305db9f-c723-4316-8c14-871815fa8b5a") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "fa43d1fd-5e9e-49b5-adf3-728e4aeb2c9f") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "CC0603KRX7R9BB104 (YAGEO)" + (at 212 -80 0) + (layer "F.Fab") + (hide yes) + (uuid "cdf74afb-dfad-498a-91e9-7025f7d9cacc") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.pwr_cap[1].cap" + (at 212 -80 0) + (layer "F.Fab") + (hide yes) + (uuid "b42bc317-aa4a-409e-acf9-d70b607090a2") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "C6" + (at 212 -80 0) + (layer "F.Fab") + (hide yes) + (uuid "d889260a-a17e-4859-a081-ee58cc4040b8") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.pwr_cap[1]" + (at 212 -80 0) + (layer "F.Fab") + (hide yes) + (uuid "c05417a3-fb64-4a35-beee-1ff5376e4c5f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000168903d6") + (sheetname "mcu") + (sheetfile "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") + (attr smd) + (fp_line + (start -0.14058 -0.51) + (end 0.14058 -0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "191e2d8a-d66e-48b9-8891-54b8c41ac468") + ) + (fp_line + (start -0.14058 0.51) + (end 0.14058 0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "7fee9e37-ea3a-4ad5-a2df-16779d972f85") + ) + (fp_line + (start 1.48 -0.73) + (end 1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "a7d381a1-f9e8-4b01-aa69-4536d09ac9d4") + ) + (fp_line + (start -1.48 -0.73) + (end 1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "f7da7ec0-c245-497e-be04-4b9109581e50") + ) + (fp_line + (start 1.48 0.73) + (end -1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "92fb46c3-f133-4cfe-8dd0-8763a85b8e95") + ) + (fp_line + (start -1.48 0.73) + (end -1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "85459bb0-ee0c-4182-b4c9-0ed2e4018461") + ) + (fp_line + (start 0.8 -0.4) + (end 0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "12a11b64-5ee1-4b41-8bcf-c2901b319232") + ) + (fp_line + (start -0.8 -0.4) + (end 0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "bf357768-3a27-4582-a9eb-e3a4b17f4b7c") + ) + (fp_line + (start 0.8 0.4) + (end -0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "2a38b4d0-1b56-4a1d-a902-30c947bdd5f3") + ) + (fp_line + (start -0.8 0.4) + (end -0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "adf935f1-f515-44a5-9be6-a9cd1d09179b") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "9b3eb0a2-75c7-42a3-bf86-4945f3b49f3f") + (effects + (font + (size 0.4 0.4) + (thickness 0.06) + ) + ) + ) + (pad "1" smd roundrect + (at -0.775 0 90) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "3463d62c-cfe3-4866-9e70-3bdc9fe97be7") + ) + (pad "2" smd roundrect + (at 0.775 0 90) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "aa31f544-ef98-43fc-be4a-561999c0923f") + ) + (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0603_1608Metric" + (layer "F.Cu") + (uuid "6bae50ab-a422-454e-9931-57f8c30beb92") + (at 146 82 -90) + (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C9" + (at -2.5 0 90) + (layer "F.SilkS") + (uuid "3b06f427-3e4e-44f6-a58d-f326243aa2e8") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C57112" + (at 0 1.43 90) + (layer "F.Fab") + (uuid "815fda8c-18c7-4536-9e9e-20d9f416bd69") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "25bd9669-846c-49a3-a3e2-cddba485c0ad") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "85758be0-fe23-452a-9dee-5f81ba304c58") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "1b218155-108f-471b-9a3e-fbf747f03c06") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "0603B103K500NT (FH(Guangdong Fenghua Advanced Tech))" + (at 64 228 0) + (layer "F.Fab") + (hide yes) + (uuid "aac452fb-2903-4933-a4ab-6502c6e3e383") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.vdda_cap_0.cap" + (at 64 228 0) + (layer "F.Fab") + (hide yes) + (uuid "db9a48e7-8a61-44a0-8048-3ea244d89af3") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "C9" + (at 64 228 0) + (layer "F.Fab") + (hide yes) + (uuid "24c83916-87a0-4ca7-ba0b-6c48b7c0f200") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.vdda_cap_0" + (at 64 228 0) + (layer "F.Fab") + (hide yes) + (uuid "df058b6b-7ce8-4637-bf16-a6588f15a6c0") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-000015dc03c2") + (sheetname "mcu") + (sheetfile "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") + (attr smd) + (fp_line + (start -0.14058 0.51) + (end 0.14058 0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "6f2639b2-46e3-4c3a-be52-7094d0fdda49") + ) + (fp_line + (start -0.14058 -0.51) + (end 0.14058 -0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "6cbec720-ed7e-4913-b326-61330d37918d") + ) + (fp_line + (start -1.48 0.73) + (end -1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "eebf4159-b18d-439f-979b-a797c96bf943") + ) + (fp_line + (start 1.48 0.73) + (end -1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "1e070f16-069b-431b-aa9d-8f1c3e592b8c") + ) + (fp_line + (start -1.48 -0.73) + (end 1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "564add34-091d-49fe-b110-c7e09582fc80") + ) + (fp_line + (start 1.48 -0.73) + (end 1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "42e6cde9-30a9-45f6-b7ce-63230c3cc687") + ) + (fp_line + (start -0.8 0.4) + (end -0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "6b5218c2-b65e-4e06-affe-0e1b4f095f4c") + ) + (fp_line + (start 0.8 0.4) + (end -0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "ec66e4e9-cce3-4612-a0f2-a56d652bd6d4") + ) + (fp_line + (start -0.8 -0.4) + (end 0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "eb61094b-6358-4773-8ca5-e16403b3f8d2") + ) + (fp_line + (start 0.8 -0.4) + (end 0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "54af95af-ebb4-4f02-bf0b-220e6263207e") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "92d25dc4-6e64-4951-b97d-ae53700d4889") + (effects + (font + (size 0.4 0.4) + (thickness 0.06) + ) + ) + ) + (pad "1" smd roundrect + (at -0.775 0 270) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "98724b38-d4cb-4457-b15a-949b57e76bf6") + ) + (pad "2" smd roundrect + (at 0.775 0 270) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "e6c7d1da-e9ea-408b-9b8e-8afac2dac2e5") + ) + (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Crystal:Crystal_SMD_3225-4Pin_3.2x2.5mm" + (layer "F.Cu") + (uuid "90631ca6-e25f-42db-a019-809b283b9dce") + (at 141 87 -90) + (descr "SMD Crystal SERIES SMD3225/4 http://www.txccrystal.com/images/pdf/7m-accuracy.pdf, 3.2x2.5mm^2 package") + (tags "SMD SMT crystal") + (property "Reference" "X1" + (at 0 -2.45 -90) + (layer "F.SilkS") + (uuid "9a6a30d1-6033-435e-9ca9-9a16703a4df4") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C9002" + (at 0 2.45 -90) + (layer "F.Fab") + (uuid "7369295c-9e68-43c9-976e-b44850ce90d8") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "c8d6b97a-b91d-469a-9f99-8a19421c78f0") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "86870f29-5fb4-43b8-8ecf-1b5baf074214") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "202fb9ca-742d-4b90-bdd0-eb3cce29896f") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "X322512MSB4SI (Yangxing Tech)" + (at 54 228 0) + (layer "F.Fab") + (hide yes) + (uuid "e63f2fa1-4763-41a1-8228-9eeaf92c63f6") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.crystal.package" + (at 54 228 0) + (layer "F.Fab") + (hide yes) + (uuid "24dab89a-341c-425b-9d2a-afbd0d365526") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "X1" + (at 54 228 0) + (layer "F.Fab") + (hide yes) + (uuid "45851ad2-78c7-4e16-b838-9310d687281f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.crystal.package" + (at 54 228 0) + (layer "F.Fab") + (hide yes) + (uuid "873b479c-41f9-46cf-a878-8851def2b57a") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-00000c1b0303/00000000-0000-0000-0000-00000b4e02cd") + (sheetname "crystal") + (sheetfile "electronics_abstract_parts.AbstractCrystal.OscillatorCrystal") + (attr smd) + (fp_line + (start -2 1.65) + (end 2 1.65) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "ba5ab1f2-8b67-4794-9c4b-5a392b14d154") + ) + (fp_line + (start -2 -1.65) + (end -2 1.65) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "37a56074-cdd6-4509-81ed-cd8edc4ea73a") + ) + (fp_line + (start -2.1 1.7) + (end 2.1 1.7) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "75063b83-1f05-4f3c-aeaf-a92b28dab66a") + ) + (fp_line + (start 2.1 1.7) + (end 2.1 -1.7) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "47d5592d-0948-4767-9f84-5fac5d7e8f95") + ) + (fp_line + (start -2.1 -1.7) + (end -2.1 1.7) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "dd3ca650-0334-4dbc-b606-9acdbd5a8d8b") + ) + (fp_line + (start 2.1 -1.7) + (end -2.1 -1.7) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "fbc294ea-7ead-4de8-8629-c6e5138139bd") + ) + (fp_line + (start -1.6 1.25) + (end 1.6 1.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "93fac30b-62e1-434d-8826-a2c8e7bd8ddf") + ) + (fp_line + (start 1.6 1.25) + (end 1.6 -1.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "0a9e70c6-bf76-481d-a780-03cf402d6b49") + ) + (fp_line + (start -1.6 0.25) + (end -0.6 1.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "45229518-87dc-4696-b626-663dabbb98c5") + ) + (fp_line + (start -1.6 -1.25) + (end -1.6 1.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "93e054ba-b0c9-4464-8676-04f71c7b431e") + ) + (fp_line + (start 1.6 -1.25) + (end -1.6 -1.25) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "7dfb2b61-35e1-4cd7-b9fd-9420209efbbb") + ) + (fp_text user "${REFERENCE}" + (at 0 0 -90) + (layer "F.Fab") + (uuid "15cfb315-72ee-41b8-8d6a-c40dde4ef05b") + (effects + (font + (size 0.7 0.7) + (thickness 0.105) + ) + ) + ) + (pad "1" smd rect + (at -1.1 0.85 270) + (size 1.4 1.2) + (layers "F.Cu" "F.Paste" "F.Mask") + (net 30 "mcu.crystal.crystal.a") + (uuid "5b76a7e8-d62e-46b8-a635-b0a9b0516e18") + ) + (pad "2" smd rect + (at 1.1 0.85 270) + (size 1.4 1.2) + (layers "F.Cu" "F.Paste" "F.Mask") + (net 1 "gnd") + (uuid "b508b1b8-e414-45ff-a1fe-a35d31e25cb1") + ) + (pad "3" smd rect + (at 1.1 -0.85 270) + (size 1.4 1.2) + (layers "F.Cu" "F.Paste" "F.Mask") + (net 15 "mcu.crystal.crystal.b") + (uuid "5311968b-6975-464b-9f72-55b9b683f8ac") + ) + (pad "4" smd rect + (at -1.1 -0.85 270) + (size 1.4 1.2) + (layers "F.Cu" "F.Paste" "F.Mask") + (net 1 "gnd") + (uuid "85e80086-0bdc-4c6f-9ce3-a78588515871") + ) + (model "${KICAD6_3DMODEL_DIR}/Crystal.3dshapes/Crystal_SMD_3225-4Pin_3.2x2.5mm.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0603_1608Metric" + (layer "F.Cu") + (uuid "975166e4-7cf6-40c6-9998-9d220186e659") + (at 148 82 -90) + (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C10" + (at -3 0 90) + (layer "F.SilkS") + (uuid "73d56008-da39-48a6-b4d8-3d8443a0cb60") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C15849" + (at 0 1.43 90) + (layer "F.Fab") + (uuid "e04174ff-a9ac-4eb3-aa77-57034f7e266f") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "f155b439-12a0-49df-9903-f96157b351b6") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "3f047a98-034c-4ffb-8931-f91a4cf422c4") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "e2b7f7dc-b5f5-47f9-a0ce-49a4845bd6bc") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "CL10A105KB8NNNC (Samsung Electro-Mechanics)" + (at 66 230 0) + (layer "F.Fab") + (hide yes) + (uuid "371da397-fab3-4bd0-96a7-9c08857ed4f2") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.vdda_cap_1.cap" + (at 66 230 0) + (layer "F.Fab") + (hide yes) + (uuid "59d601e1-10cb-408f-9b29-ec012e166474") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "C10" + (at 66 230 0) + (layer "F.Fab") + (hide yes) + (uuid "0fa57e73-ee3e-4d04-8df3-7dc7729bb022") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.vdda_cap_1" + (at 66 230 0) + (layer "F.Fab") + (hide yes) + (uuid "063afe04-e740-43fa-839e-f710ca00ede0") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-000015dd03c3") + (sheetname "mcu") + (sheetfile "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") + (attr smd) + (fp_line + (start -0.14058 0.51) + (end 0.14058 0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "8f3a4041-5000-49ff-95da-429b61453557") + ) + (fp_line + (start -0.14058 -0.51) + (end 0.14058 -0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "57b5c31a-771d-4c3e-9376-ecdd665fbfcc") + ) + (fp_line + (start -1.48 0.73) + (end -1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "87f3a5ae-e324-4baf-95bc-e783f61ab539") + ) + (fp_line + (start 1.48 0.73) + (end -1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "ebe11735-5ea0-4092-9151-f3212c49e59d") + ) + (fp_line + (start -1.48 -0.73) + (end 1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "2a4c13a8-1675-46ef-8b96-28ebb1a5d58d") + ) + (fp_line + (start 1.48 -0.73) + (end 1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "8d5c1d0d-12c0-492a-b757-29e44213ff1f") + ) + (fp_line + (start -0.8 0.4) + (end -0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "7262ee22-9e57-46c7-956f-a3aa92864a96") + ) + (fp_line + (start 0.8 0.4) + (end -0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "132d6795-7a00-432d-9930-1efcb7bb18a4") + ) + (fp_line + (start -0.8 -0.4) + (end 0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "d3b998cf-a2cd-4f90-beeb-5d6f557e8b83") + ) + (fp_line + (start 0.8 -0.4) + (end 0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "1ed6567b-63f0-4112-a2cb-1f7734be5f35") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "b82a8312-94bb-4a0a-b79f-66849ad66559") + (effects + (font + (size 0.4 0.4) + (thickness 0.06) + ) + ) + ) + (pad "1" smd roundrect + (at -0.775 0 270) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "b3afc816-d9b2-4c8c-b010-592ddbc16ffa") + ) + (pad "2" smd roundrect + (at 0.775 0 270) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "9304f30f-994c-4907-89b7-286fa333035f") + ) + (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0603_1608Metric" + (layer "F.Cu") + (uuid "9a565ea9-18fc-466a-846e-b7432f1bfec8") + (at 141 82 180) + (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C12" + (at -3 0 0) + (layer "F.SilkS") + (uuid "fa7ce4b1-b6c6-4664-9fea-011f56104a22") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C1663" + (at 0 1.43 0) + (layer "F.Fab") + (uuid "aa2b6522-6ff2-438b-abc2-c0d32f12d497") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 180) + (layer "F.Fab") + (hide yes) + (uuid "b2c7b336-ffce-4be2-af75-b6b9e49950fe") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 180) + (layer "F.Fab") + (hide yes) + (uuid "7f543dc5-8d88-4198-a110-4513a4397423") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 180) + (layer "F.Fab") + (hide yes) + (uuid "3a68a896-a4f9-43b8-b7f5-4e8d6a869d3c") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "CL10C330JB8NNNC (Samsung Electro-Mechanics)" + (at 282 164 0) + (layer "F.Fab") + (hide yes) + (uuid "a6098b47-32a5-4ffe-b7aa-bd39073a6df6") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.crystal.cap_b" + (at 282 164 0) + (layer "F.Fab") + (hide yes) + (uuid "9fc97fc9-2c0a-4f4a-91b6-83480d772003") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "C12" + (at 282 164 0) + (layer "F.Fab") + (hide yes) + (uuid "ae9faf19-44ff-4647-8b77-9d2bbf3bbbe6") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.crystal.cap_b" + (at 282 164 0) + (layer "F.Fab") + (hide yes) + (uuid "fcb24636-8a7a-4471-81f8-43e115d053af") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-00000c1b0303/00000000-0000-0000-0000-000005e801f6") + (sheetname "crystal") + (sheetfile "electronics_abstract_parts.AbstractCrystal.OscillatorCrystal") + (attr smd) + (fp_line + (start -0.14058 0.51) + (end 0.14058 0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "4818b550-1f3b-461b-ad1c-f35265e68a8b") + ) + (fp_line + (start -0.14058 -0.51) + (end 0.14058 -0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "e26ce60b-dabf-4e54-9656-0d09c8745c39") + ) + (fp_line + (start 1.48 0.73) + (end -1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "fedb447a-1f69-49a0-846c-e2dab2eb7a8b") + ) + (fp_line + (start 1.48 -0.73) + (end 1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "ad17f3ff-8b20-4687-a4bc-95b15fd64047") + ) + (fp_line + (start -1.48 0.73) + (end -1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "fecd0c2d-1548-45db-96da-ac775a5fe559") + ) + (fp_line + (start -1.48 -0.73) + (end 1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "8e42fce0-f725-4b68-accd-11fd4304aeb3") + ) + (fp_line + (start 0.8 0.4) + (end -0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "7bae6cee-bcab-4422-9c93-82e5cd042ef7") + ) + (fp_line + (start 0.8 -0.4) + (end 0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "eb879da0-fa14-4b03-aa2b-a94cce292047") + ) + (fp_line + (start -0.8 0.4) + (end -0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "6df4f9a5-c4c2-42f1-bc8f-16ecc0a19752") + ) + (fp_line + (start -0.8 -0.4) + (end 0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "65da7d8a-5c41-4c1e-b434-e373befa0d82") + ) + (fp_text user "${REFERENCE}" + (at 0 0 0) + (layer "F.Fab") + (uuid "a4f3a099-a1de-4f8f-92fd-3c23dd281daa") + (effects + (font + (size 0.4 0.4) + (thickness 0.06) + ) + ) + ) + (pad "1" smd roundrect + (at -0.775 0 180) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 15 "mcu.crystal.crystal.b") + (uuid "1d1aaffb-9d0c-48f2-aacf-37abfa952f6b") + ) + (pad "2" smd roundrect + (at 0.775 0 180) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "adad975c-2c75-43cb-a68e-6f014cee6976") + ) + (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Capacitor_SMD:C_0603_1608Metric" + (layer "F.Cu") + (uuid "9f1560db-15dd-45d5-95d6-a2e616eb29e8") + (at 135 82 -90) + (descr "Capacitor SMD 0603 (1608 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: IPC-SM-782 page 76, https://www.pcb-3d.com/wordpress/wp-content/uploads/ipc-sm-782a_amendment_1_and_2.pdf), generated with kicad-footprint-generator") + (tags "capacitor") + (property "Reference" "C8" + (at -2.5 0 90) + (layer "F.SilkS") + (uuid "3c170679-97ee-4f6e-9d8b-2b2289cee67b") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C14663" + (at 0 1.43 90) + (layer "F.Fab") + (uuid "da7cca78-ad4f-49b2-93e6-30da69e22ffa") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "edd0e61f-ac02-405f-900c-07b48a447823") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "b0446c42-0a89-4853-ad3a-5ba31f285567") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 -90) + (layer "F.Fab") + (hide yes) + (uuid "b0f7d909-03d4-4682-a726-bec6463470c4") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "CC0603KRX7R9BB104 (YAGEO)" + (at 53 217 0) + (layer "F.Fab") + (hide yes) + (uuid "a7a56eba-72d3-4dc2-80a5-287ab632ad8c") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.pwr_cap[3].cap" + (at 53 217 0) + (layer "F.Fab") + (hide yes) + (uuid "44509bdb-650e-40d1-9a1e-04ad8715bbdd") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "C8" + (at 53 217 0) + (layer "F.Fab") + (hide yes) + (uuid "e551652f-82a1-4597-b838-c92bdfbfc26e") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.pwr_cap[3]" + (at 53 217 0) + (layer "F.Fab") + (hide yes) + (uuid "0fe92772-6ff5-41c0-8efc-09f716336171") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000168d03d8") + (sheetname "mcu") + (sheetfile "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") + (attr smd) + (fp_line + (start -0.14058 0.51) + (end 0.14058 0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "3a7c8ed8-5ded-4a1c-ac14-0bd0208f7daa") + ) + (fp_line + (start -0.14058 -0.51) + (end 0.14058 -0.51) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "a9f9d173-096a-40dc-9e6f-fc960dedc8bd") + ) + (fp_line + (start -1.48 0.73) + (end -1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "74f3c5e9-a070-44fd-8ad4-372d9e0912ef") + ) + (fp_line + (start 1.48 0.73) + (end -1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "108d8200-4977-4d49-9e5a-35424a7621f3") + ) + (fp_line + (start -1.48 -0.73) + (end 1.48 -0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "8c84e01a-b9f5-4c24-938b-b0b9957b881f") + ) + (fp_line + (start 1.48 -0.73) + (end 1.48 0.73) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "4cd074da-fb95-4843-bdb5-d2f55279d409") + ) + (fp_line + (start -0.8 0.4) + (end -0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "9ef3052d-e69f-4629-9008-408abc6cdefe") + ) + (fp_line + (start 0.8 0.4) + (end -0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "f180fc7a-3890-4814-9c62-a911a91d0c8d") + ) + (fp_line + (start -0.8 -0.4) + (end 0.8 -0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "de5f38d6-2d58-42b7-92a3-8709b87eb568") + ) + (fp_line + (start 0.8 -0.4) + (end 0.8 0.4) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "794943b7-48a6-4d41-a606-8079a765b3ec") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "5b15b69a-ea68-417d-9af9-0d51c997a226") + (effects + (font + (size 0.4 0.4) + (thickness 0.06) + ) + ) + ) + (pad "1" smd roundrect + (at -0.775 0 270) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "632c4c34-c806-44c1-9098-0fd47609fd84") + ) + (pad "2" smd roundrect + (at 0.775 0 270) + (size 0.9 0.95) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "f17c1d6a-9c20-4bde-a2a4-3a16f712cd33") + ) + (model "${KICAD6_3DMODEL_DIR}/Capacitor_SMD.3dshapes/C_0603_1608Metric.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (footprint "Package_QFP:LQFP-48_7x7mm_P0.5mm" + (layer "F.Cu") + (uuid "d5fdde7e-99d1-4a23-a830-676da53a3a31") + (at 141 74 90) + (descr "LQFP, 48 Pin (https://www.analog.com/media/en/technical-documentation/data-sheets/ltc2358-16.pdf), generated with kicad-footprint-generator ipc_gullwing_generator.py") + (tags "LQFP QFP") + (property "Reference" "U3" + (at 0 -5.85 90) + (layer "F.SilkS") + (uuid "d019ddcf-dae2-4872-9f2b-c4642a9fb5a4") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Value" "C8734" + (at 0 5.85 90) + (layer "F.Fab") + (uuid "6f64cdaf-5a6b-4b22-a2cf-5aeb1c54c1d8") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "Footprint" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "4e43496a-63d0-4457-b9a5-54f9e3c15caf") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Datasheet" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "c41875ca-a950-403f-9003-b77aa0be57a1") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "Description" "" + (at 0 0 90) + (layer "F.Fab") + (hide yes) + (uuid "9def67bf-d809-4bdb-99fd-a1eb20551389") + (effects + (font + (size 1.27 1.27) + (thickness 0.15) + ) + ) + ) + (property "edg_part" "STM32F103xxT6 (STMicroelectronics)" + (at 215 -67 0) + (layer "F.Fab") + (hide yes) + (uuid "714e2f4e-3340-43dc-9969-5a7bd420653b") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_path" "mcu.ic" + (at 215 -67 0) + (layer "F.Fab") + (hide yes) + (uuid "f0fd643d-b5e2-41d4-a448-33d43422a08d") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_refdes" "U3" + (at 215 -67 0) + (layer "F.Fab") + (hide yes) + (uuid "e5107701-de5e-472a-af20-964e1989dbf7") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (property "edg_short_path" "mcu.ic" + (at 215 -67 0) + (layer "F.Fab") + (hide yes) + (uuid "6ee8e431-0ba8-4297-bdcb-e3f51c017517") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (path "/00000000-0000-0000-0000-000002850146/00000000-0000-0000-0000-0000013700cd") + (sheetname "mcu") + (sheetfile "electronics_lib.Microcontroller_Stm32f103.Stm32f103_48") + (attr smd) + (fp_line + (start 3.61 -3.61) + (end 3.61 -3.16) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "cbffd746-07c0-49dd-98d2-bf594ba545f4") + ) + (fp_line + (start 3.16 -3.61) + (end 3.61 -3.61) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "17608267-074f-4583-b077-bfc0d495838a") + ) + (fp_line + (start -3.16 -3.61) + (end -3.61 -3.61) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "0cf2ffb1-1263-4c3e-b3c6-f1bdbd864afa") + ) + (fp_line + (start -3.61 -3.61) + (end -3.61 -3.16) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "29273be9-ab38-4966-95e2-0d12d82a928e") + ) + (fp_line + (start -3.61 -3.16) + (end -4.9 -3.16) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "b13b1cb0-5a31-46be-8cbb-faea8ea1cac3") + ) + (fp_line + (start 3.61 3.61) + (end 3.61 3.16) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "4f5e8f95-6331-4be3-b2d3-1cb817e84ee3") + ) + (fp_line + (start 3.16 3.61) + (end 3.61 3.61) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "1f87d628-66e3-4d9a-9c7f-1e7af57875ef") + ) + (fp_line + (start -3.16 3.61) + (end -3.61 3.61) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "cdb5b0f8-ff7a-41e4-bee6-eb1505359820") + ) + (fp_line + (start -3.61 3.61) + (end -3.61 3.16) + (stroke + (width 0.12) + (type solid) + ) + (layer "F.SilkS") + (uuid "8f0a0b09-0306-4133-8245-d6af19bd7df6") + ) + (fp_line + (start 3.15 -5.15) + (end 3.15 -3.75) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "c9704ac4-7f19-4b50-bfea-673e2120034d") + ) + (fp_line + (start 0 -5.15) + (end 3.15 -5.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "258777ee-9505-41e6-b27f-bb6214dd38c2") + ) + (fp_line + (start 0 -5.15) + (end -3.15 -5.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "74e59f32-8155-4909-a945-17b8828931b8") + ) + (fp_line + (start -3.15 -5.15) + (end -3.15 -3.75) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "3ccd4646-716c-4495-ac5e-3f7146f8ee28") + ) + (fp_line + (start 3.75 -3.75) + (end 3.75 -3.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "9d1e12de-5254-41a3-b3bc-49d45c2e554f") + ) + (fp_line + (start 3.15 -3.75) + (end 3.75 -3.75) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "2dc32cb6-ace0-42f3-803c-ff5248c03aa2") + ) + (fp_line + (start -3.15 -3.75) + (end -3.75 -3.75) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "ee2f3ac2-a51d-4dd9-8afe-a82f5b30d540") + ) + (fp_line + (start -3.75 -3.75) + (end -3.75 -3.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "1213d7a3-f877-483f-8e5e-50459ea920a1") + ) + (fp_line + (start 5.15 -3.15) + (end 5.15 0) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "631fd876-98c8-418f-a8c6-03e7211750a9") + ) + (fp_line + (start 3.75 -3.15) + (end 5.15 -3.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "d5369598-cafa-4060-b8ac-427534aa4851") + ) + (fp_line + (start -3.75 -3.15) + (end -5.15 -3.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "22b2fdab-a45a-40aa-a46b-47868d6401a7") + ) + (fp_line + (start -5.15 -3.15) + (end -5.15 0) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "1ca0da5f-ffe2-4cd1-aada-ebca4ccffb9b") + ) + (fp_line + (start 5.15 3.15) + (end 5.15 0) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "a5b93785-accd-47cb-850a-e3033a56bcfb") + ) + (fp_line + (start 3.75 3.15) + (end 5.15 3.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "87174331-4d62-48c1-904a-5a01c77dfbe0") + ) + (fp_line + (start -3.75 3.15) + (end -5.15 3.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "8e01940a-7cc5-412c-b220-0fb93cc0f7a3") + ) + (fp_line + (start -5.15 3.15) + (end -5.15 0) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "b5e227a0-ab11-4e7b-8459-681883384857") + ) + (fp_line + (start 3.75 3.75) + (end 3.75 3.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "acbb7ea9-97a0-4129-b886-62b195c083cc") + ) + (fp_line + (start 3.15 3.75) + (end 3.75 3.75) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "b89c8af5-b834-4913-9c11-7483eb8c9792") + ) + (fp_line + (start -3.15 3.75) + (end -3.75 3.75) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "7dde4c52-b9a5-4260-9618-929b9764767c") + ) + (fp_line + (start -3.75 3.75) + (end -3.75 3.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "993858dc-149e-46da-a99c-ec0bc2e117c6") + ) + (fp_line + (start 3.15 5.15) + (end 3.15 3.75) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "24daa533-7c9e-4a6d-959b-4c17650e3005") + ) + (fp_line + (start 0 5.15) + (end 3.15 5.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "16faa268-610c-483b-beec-70ccf84e4912") + ) + (fp_line + (start 0 5.15) + (end -3.15 5.15) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "79cfe0de-a420-4053-8fe6-e9254cecfcf5") + ) + (fp_line + (start -3.15 5.15) + (end -3.15 3.75) + (stroke + (width 0.05) + (type solid) + ) + (layer "F.CrtYd") + (uuid "f7307669-1eec-48a6-a003-b18b262f9966") + ) + (fp_line + (start 3.5 -3.5) + (end 3.5 3.5) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "78145cdd-d8f4-420b-8762-1d881f01878f") + ) + (fp_line + (start -2.5 -3.5) + (end 3.5 -3.5) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "9d2f3b4e-f244-4dfd-892d-bcbf0e11a663") + ) + (fp_line + (start -3.5 -2.5) + (end -2.5 -3.5) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "984e84c6-6a7c-48cc-8486-76ed511014dd") + ) + (fp_line + (start 3.5 3.5) + (end -3.5 3.5) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "ec42d7d6-f914-4600-8546-2a3ae12cc231") + ) + (fp_line + (start -3.5 3.5) + (end -3.5 -2.5) + (stroke + (width 0.1) + (type solid) + ) + (layer "F.Fab") + (uuid "43bf9cc2-d203-4a63-a188-138c5e6a96bc") + ) + (fp_text user "${REFERENCE}" + (at 0 0 90) + (layer "F.Fab") + (uuid "6e28052c-c145-4731-84f9-30707b0229e7") + (effects + (font + (size 1 1) + (thickness 0.15) + ) + ) + ) + (pad "1" smd roundrect + (at -4.1625 -2.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "96aa77a7-43ab-4235-9cb6-7ef934c6dfd2") + ) + (pad "2" smd roundrect + (at -4.1625 -2.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "367748b3-8043-468a-800f-90eb4eab61ae") + ) + (pad "3" smd roundrect + (at -4.1625 -1.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "014124ae-5fb6-4ff6-8f36-752883360c2f") + ) + (pad "4" smd roundrect + (at -4.1625 -1.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "706b1d53-a4eb-4cac-9625-9faba85e9dfe") + ) + (pad "5" smd roundrect + (at -4.1625 -0.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 30 "mcu.crystal.crystal.a") + (uuid "c773a581-9b5e-45cb-a926-b19c03dc8f82") + ) + (pad "6" smd roundrect + (at -4.1625 -0.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 15 "mcu.crystal.crystal.b") + (uuid "6e469894-98d3-4725-a3a4-d66c231002fa") + ) + (pad "7" smd roundrect + (at -4.1625 0.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 29 "mcu.swd.swd.reset") + (uuid "1aaa0773-25f8-469d-a367-393c2c573ed0") + ) + (pad "8" smd roundrect + (at -4.1625 0.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "f8d28925-d24e-4011-aa8e-451ef6c8434e") + ) + (pad "9" smd roundrect + (at -4.1625 1.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "4c6c972d-3181-41bc-bdaa-41e11dfbceb8") + ) + (pad "10" smd roundrect + (at -4.1625 1.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 28 "mag.pins.2") + (uuid "af71420f-455b-4867-ac3d-a57805c662e1") + ) + (pad "11" smd roundrect + (at -4.1625 2.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 11 "mcu.gpio.buck_pwm") + (uuid "d9a57817-5e75-48df-9902-6272c58d5ce6") + ) + (pad "12" smd roundrect + (at -4.1625 2.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 8 "mcu.gpio.boost_pwm") + (uuid "95b362fe-411f-4c3c-a0a6-8bfb60de75ff") + ) + (pad "13" smd roundrect + (at -2.75 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 12 "mcu.adc.conv_sense") + (uuid "75368005-040f-4ff6-bf73-3f6ead9c26bd") + ) + (pad "14" smd roundrect + (at -2.25 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 5 "mcu.adc.curr_2") + (uuid "d1be1e94-8b24-4770-b2ea-d5aaf55f9fd5") + ) + (pad "15" smd roundrect + (at -1.75 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 3 "mcu.adc.curr_1") + (uuid "ca4e8bf8-2b99-44e2-a858-a3174b5f033b") + ) + (pad "16" smd roundrect + (at -1.25 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 4 "mcu.adc.curr_3") + (uuid "1c2bba14-48db-423d-806d-9578432b31fe") + ) + (pad "17" smd roundrect + (at -0.75 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 18 "bldc_drv.ins.1") + (uuid "d3d899de-ea42-4e5b-8a0e-1ce53012ad30") + ) + (pad "18" smd roundrect + (at -0.25 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 24 "bldc_drv.ens.1") + (uuid "f7dcd519-3952-4d73-a9dc-f4b33af36a76") + ) + (pad "19" smd roundrect + (at 0.25 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 19 "mcu.gpio.bldc_in_2") + (uuid "711f293d-b1f9-404b-bbef-ae651fd02434") + ) + (pad "20" smd roundrect + (at 0.75 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 17 "bldc_drv.ens.2") + (uuid "b1b17019-9e7e-4f9b-b55b-3de2ccedab96") + ) + (pad "21" smd roundrect + (at 1.25 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 20 "mcu.gpio.bldc_in_3") + (uuid "2678ea51-0a88-43d6-ba7f-999d4253d6c4") + ) + (pad "22" smd roundrect + (at 1.75 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 25 "mcu.gpio.bldc_en_3") + (uuid "34ce9799-90a0-4d14-b3e0-c6f4c7247b06") + ) + (pad "23" smd roundrect + (at 2.25 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "acdf3f13-a9d6-4368-9952-0b788e1a6f92") + ) + (pad "24" smd roundrect + (at 2.75 4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "e2f2036a-5d62-4dce-b8b5-ba60ef768260") + ) + (pad "25" smd roundrect + (at 4.1625 2.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 7 "mcu.gpio.bldc_fault") + (uuid "95f048c2-65ef-4a7a-bb24-607d38b17924") + ) + (pad "26" smd roundrect + (at 4.1625 2.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 6 "mcu.gpio.bldc_reset") + (uuid "953c6948-33a5-4f10-9284-f734e458007f") + ) + (pad "27" smd roundrect + (at 4.1625 1.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "486f2c09-033e-473b-ab16-a3a49d4ccd2c") + ) + (pad "28" smd roundrect + (at 4.1625 1.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "766ce5a6-f413-4ce5-b295-493785ac1e5e") + ) + (pad "29" smd roundrect + (at 4.1625 0.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "0f6be9f6-c07f-486d-989e-5363d8c8c8cf") + ) + (pad "30" smd roundrect + (at 4.1625 0.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "5b0883a3-74b6-4624-b0ac-bcf28f1aca21") + ) + (pad "31" smd roundrect + (at 4.1625 -0.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "82f6e6c0-80f1-4605-a459-412066dc00e8") + ) + (pad "32" smd roundrect + (at 4.1625 -0.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 16 "usb_esd.usb.dm") + (uuid "7d1c239b-1e0a-405c-b3e8-fcfe6d9c68cf") + ) + (pad "33" smd roundrect + (at 4.1625 -1.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 23 "usb.usb.dp") + (uuid "275f6b53-6c19-47cc-a380-dd1f6b19f5ba") + ) + (pad "34" smd roundrect + (at 4.1625 -1.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 27 "mcu.ic.swd.swdio") + (uuid "d2267ce7-27a0-4323-8ee4-edf4fee0fb32") + ) + (pad "35" smd roundrect + (at 4.1625 -2.25 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "6304bfb8-8088-47b2-b268-8c42dda4977a") + ) + (pad "36" smd roundrect + (at 4.1625 -2.75 90) + (size 1.475 0.3) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "ed8aadd5-794e-4c98-b408-9d1ce6b0042f") + ) + (pad "37" smd roundrect + (at 2.75 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 26 "mcu.swd.swd.swclk") + (uuid "8c8574f3-6197-4d42-afcd-951cbbea49fb") + ) + (pad "38" smd roundrect + (at 2.25 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 9 "mcu.gpio.sw1") + (uuid "94630d8a-4b7d-4c70-ab8a-50d9a0352e5d") + ) + (pad "39" smd roundrect + (at 1.75 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 14 "mcu.swd.swd.swo") + (uuid "29103c59-8ce5-46dd-9e43-49119b9f9202") + ) + (pad "40" smd roundrect + (at 1.25 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 13 "mcu.gpio.rgb") + (uuid "fa9cc7bf-c7f5-45dc-8a51-d6fea1d4be1a") + ) + (pad "41" smd roundrect + (at 0.75 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "1d7c383e-b303-4276-b1ae-0473a3a7d933") + ) + (pad "42" smd roundrect + (at 0.25 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 22 "i2c_tp.io.scl") + (uuid "0c7d622f-98c9-47fc-a230-266a7d42c29f") + ) + (pad "43" smd roundrect + (at -0.25 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 21 "i2c.i2c.sda") + (uuid "a3250968-71c2-4773-a98e-c01f90af4385") + ) + (pad "44" smd roundrect + (at -0.75 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "56c7eb5a-e878-482e-afc3-f04edc39be27") + ) + (pad "45" smd roundrect + (at -1.25 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 10 "mcu.gpio.pd_int") + (uuid "62971e02-8fe8-428f-8d13-1152d681aeef") + ) + (pad "46" smd roundrect + (at -1.75 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (uuid "ad03fcdc-4174-47fa-8adf-59d545ff9482") + ) + (pad "47" smd roundrect + (at -2.25 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 1 "gnd") + (uuid "e8e8fa85-25a5-4185-8a32-9057d41f8cb4") + ) + (pad "48" smd roundrect + (at -2.75 -4.1625 90) + (size 0.3 1.475) + (layers "F.Cu" "F.Paste" "F.Mask") + (roundrect_rratio 0.25) + (net 2 "v3v3") + (uuid "0bc7eacd-aa40-4cbc-98dc-908cdb46c266") + ) + (model "${KICAD6_3DMODEL_DIR}/Package_QFP.3dshapes/LQFP-48_7x7mm_P0.5mm.wrl" + (offset + (xyz 0 0 0) + ) + (scale + (xyz 1 1 1) + ) + (rotate + (xyz 0 0 0) + ) + ) + ) + (segment + (start 148 82.775) + (end 146 82.775) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "068c8d2a-738c-4d78-9cc7-89015f99b1d9") + ) + (segment + (start 140.225 82) + (end 139.5 82) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "0877f30d-da22-4503-bc80-710e25164112") + ) + (segment + (start 138.75 69.8375) + (end 138.75 70.75) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "091011d4-33cb-41d2-aee9-6c9675a41ae5") + ) + (segment + (start 136 65.225) + (end 135.225 65.225) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "0f2f7f80-9d26-479b-8d26-8096c748e7d0") + ) + (segment + (start 136.8375 76.25) + (end 137.75 76.25) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "1396c729-7fb9-4cae-968b-9de9ff42b2d8") + ) + (segment + (start 139.5 88.1) + (end 139 87.6) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "19c93769-8d03-4e55-a9ad-236cb6368a70") + ) + (segment + (start 134.05 82.95) + (end 133 82.95) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "1f53b826-b639-4e4c-9184-44772226ffb0") + ) + (segment + (start 146 65.225) + (end 146.775 65.225) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "2134f188-1235-4268-9fe8-c720a554047f") + ) + (segment + (start 137.75 76.25) + (end 138.5 75.5) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "2efe80ca-cc94-431c-ab7f-13f0a1b1b1ef") + ) + (segment + (start 144.25 71.75) + (end 143.5 72.5) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "2ff69acc-60fb-4a01-99b2-852aef917832") + ) + (segment + (start 146 82.775) + (end 146.775 82.775) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "307a37e7-2984-40ff-a1e1-5ab509067e3b") + ) + (segment + (start 139 87.6) + (end 139 82.5) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "401ad00c-0775-469c-ad64-f78164ddffeb") + ) + (segment + (start 141.85 84.075) + (end 141.775 84) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "4f76b7ef-7465-421f-b35d-aaebfe681fa3") + ) + (segment + (start 141.775 84) + (end 142.5 84) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "58fd0018-a301-4c3b-9b41-d746ae45a444") + ) + (segment + (start 135.225 65.225) + (end 135 65) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "5d294bca-85d5-40ea-8e44-c49668dcbc18") + ) + (segment + (start 139 82.5) + (end 139.5 82) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "6ec08251-b217-4309-8077-d7f6dd7a4070") + ) + (segment + (start 135 82.775) + (end 134.225 82.775) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "77148fe3-b1bd-4f57-bb46-96bc59a5391d") + ) + (segment + (start 146.775 65.225) + (end 147 65) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "81fb6b63-3b00-43dc-bd3d-adba3ee0f2be") + ) + (segment + (start 138.25 74.75) + (end 138.5 74.5) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "87b65d94-0f61-454d-ad90-beadb9f2d86f") + ) + (segment + (start 141.75 76.75) + (end 142 76.5) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "89581a13-f3c5-4f4e-893f-a084b0fca244") + ) + (segment + (start 141.85 85.9) + (end 141.85 84.075) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "8d090ac7-dddd-42f5-ba80-6833dc8f2c1d") + ) + (segment + (start 134.225 82.775) + (end 134.05 82.95) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "945fbf96-3d29-4118-813e-dfe6fb865445") + ) + (segment + (start 141.75 78.1625) + (end 141.75 76.75) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "9e212324-aff4-432a-9845-d6eb5168ebf0") + ) + (segment + (start 134.225 82.775) + (end 134 83) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "ae06492b-4e79-4841-977d-4918740ca329") + ) + (segment + (start 145.1625 71.75) + (end 144.25 71.75) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "b8e01547-7812-4f79-9cad-3b035dfca399") + ) + (segment + (start 136.8375 74.75) + (end 138.25 74.75) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "bc0f886b-76a2-4df5-8c43-c279fad61b62") + ) + (segment + (start 146.775 82.775) + (end 147 83) + (width 0.5) + (layer "F.Cu") + (net 1) + (uuid "dd32f3f1-d51b-4d1d-a6b4-b03474bb13dc") + ) + (segment + (start 140.15 88.1) + (end 139.5 88.1) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "e4698f21-8a6a-4538-a0dc-b998a3018088") + ) + (segment + (start 138.75 70.75) + (end 139.5 71.5) + (width 0.2) + (layer "F.Cu") + (net 1) + (uuid "f6290150-8e73-4c9b-a6ec-46fbbf6e9681") + ) + (via + (at 138.5 75.5) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "14b6573f-ec08-43cf-828e-125b88a5eeaf") + ) + (via + (at 135 65) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "17551e9e-8f26-4689-8975-331dc0a6090b") + ) + (via + (at 138.5 74.5) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "1b407f5a-c04f-449c-8d4e-bade1c426861") + ) + (via + (at 139.5 82) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "1cdd4504-17e5-4073-a5de-8fbb4fe73ebe") + ) + (via + (at 142 76.5) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "2d293e82-5e2b-48a2-a326-469c72aed7b5") + ) + (via + (at 134 83) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "37b71817-aee7-4efc-8dc6-20ec8e00e102") + ) + (via + (at 143.5 72.5) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "48b646d9-6aef-418a-b7fc-84a6a5961ea1") + ) + (via + (at 142.5 84) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "93a74b95-f2fe-4a3e-b558-69d447127182") + ) + (via + (at 147 83) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "c39e6290-115b-4f1d-ac9c-90623c4a1368") + ) + (via + (at 147 65) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "d0107ef8-905b-4914-8db8-236458f4edb3") + ) + (via + (at 139.5 71.5) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 1) + (uuid "f73163c9-78f9-40b1-9f70-1ac8c5beaa58") + ) + (segment + (start 143 76.5) + (end 142.25 77.25) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "0068eae4-cc63-4c36-b213-95ce9f2d4603") + ) + (segment + (start 143.5 76.5) + (end 146 79) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "032c3ed3-2ce2-4b00-bb5f-ba77a5c68b93") + ) + (segment + (start 138 77) + (end 135 80) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "03c81079-5a62-4a46-aae9-f514827949fe") + ) + (segment + (start 146 69) + (end 144 71) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "09ebb47f-e4e2-4e75-944b-4d91d23d0729") + ) + (segment + (start 138.25 77.25) + (end 138 77) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "29f55f97-ef30-4bcb-b5ef-e1c1684f48cb") + ) + (segment + (start 143.5 76.5) + (end 138 71) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "3ed6fe64-65a4-49c4-8846-0d914629bf61") + ) + (segment + (start 144 71) + (end 138 77) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "49d9f0de-6b60-40c7-9ad3-460632f0798d") + ) + (segment + (start 136.8375 76.75) + (end 137.75 76.75) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "532ef4d8-d82a-4a5e-87c1-0c739bf17d26") + ) + (segment + (start 143.5 76.5) + (end 143 76.5) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "60f07ebf-1b48-4f76-8117-d1356e7c3ac7") + ) + (segment + (start 144.25 71.25) + (end 144 71) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "63af8ebf-e5da-4507-971a-8cca1206dbdb") + ) + (segment + (start 142.25 77.25) + (end 142.25 78.1625) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "67379501-3ba9-4298-bd68-66727e751b5e") + ) + (segment + (start 146 66.775) + (end 146 69) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "6bef903b-7b0c-431e-b8c9-e3fe904f2459") + ) + (segment + (start 138 71) + (end 136 69) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "6f184c36-248b-4ad4-9fb2-6769b68efb84") + ) + (segment + (start 145.1625 71.25) + (end 144.25 71.25) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "744b5831-9da5-4637-955f-6d339d0cf77b") + ) + (segment + (start 135 81.225) + (end 134.225 81.225) + (width 0.5) + (layer "F.Cu") + (net 2) + (uuid "7c81ba76-763b-406a-befa-68201e6379ab") + ) + (segment + (start 138.25 78.1625) + (end 138.25 77.25) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "7fa826b3-43cf-4474-95fd-ceab95c474f5") + ) + (segment + (start 148 81.225) + (end 146 81.225) + (width 0.5) + (layer "F.Cu") + (net 2) + (uuid "8ac0c51c-8727-4db0-96e6-523ce461b3e0") + ) + (segment + (start 134.225 81.225) + (end 134.05 81.05) + (width 0.5) + (layer "F.Cu") + (net 2) + (uuid "9f918f89-b5f8-403a-bbcf-f95e345daa08") + ) + (segment + (start 146 79) + (end 146 81.225) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "a08dd2d8-76cd-4c89-b989-d4957a3756be") + ) + (segment + (start 135 80) + (end 135 81.225) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "bfe6ab58-702e-4a85-b5ae-162531a5791d") + ) + (segment + (start 136 66.775) + (end 136 69) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "ca6feaeb-1e5f-4d01-995d-d60b7f1ec6e4") + ) + (segment + (start 137.75 76.75) + (end 138 77) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "ce173204-a5ac-4a11-8eb4-ef686bc5b916") + ) + (segment + (start 138.25 70.75) + (end 138 71) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "d679d82d-9b39-4d98-b8b1-1f1c7ef2f37f") + ) + (segment + (start 134.05 81.05) + (end 133 81.05) + (width 0.5) + (layer "F.Cu") + (net 2) + (uuid "d86eb023-dd88-42c6-8738-79b7fde1b57f") + ) + (segment + (start 138.25 69.8375) + (end 138.25 70.75) + (width 0.2) + (layer "F.Cu") + (net 2) + (uuid "e78863de-2c7a-4909-bbbe-1f3581e019eb") + ) + (via + (at 143.5 76.5) + (size 0.7) + (drill 0.3) + (layers "F.Cu" "B.Cu") + (net 2) + (uuid "2062349f-97e9-4657-a553-8a3bae47fbaf") + ) + (segment + (start 141.5 81) + (end 141.5 80.5) + (width 0.2) + (layer "F.Cu") + (net 15) + (uuid "572d1903-fa81-4a00-ae73-a605f9f3eb64") + ) + (segment + (start 141.775 82) + (end 141.775 82.725) + (width 0.2) + (layer "F.Cu") + (net 15) + (uuid "6fc63ea0-037e-498a-a878-9808ab91bd67") + ) + (segment + (start 140.75 79.75) + (end 141.5 80.5) + (width 0.2) + (layer "F.Cu") + (net 15) + (uuid "80ef314c-0e21-4a25-98a2-baef547c7d96") + ) + (segment + (start 141.775 82.725) + (end 141 83.5) + (width 0.2) + (layer "F.Cu") + (net 15) + (uuid "9ddcb14a-4baa-409c-b0ba-8d1d48d51a32") + ) + (segment + (start 141.775 81.275) + (end 141.5 81) + (width 0.2) + (layer "F.Cu") + (net 15) + (uuid "a85a5b8f-0b80-40ce-9677-c4c3ac70d88f") + ) + (segment + (start 141.775 82) + (end 141.775 81.275) + (width 0.2) + (layer "F.Cu") + (net 15) + (uuid "b2648c58-3420-4e57-899e-eb6948ea23a1") + ) + (segment + (start 140.75 78.1625) + (end 140.75 79.75) + (width 0.2) + (layer "F.Cu") + (net 15) + (uuid "e38141b5-9c36-4dde-b5a7-8fb08cc685e5") + ) + (segment + (start 141 87.25) + (end 141.85 88.1) + (width 0.2) + (layer "F.Cu") + (net 15) + (uuid "f402f4be-c0d8-4ec9-93ac-b2ef498f2b01") + ) + (segment + (start 141 83.5) + (end 141 87.25) + (width 0.2) + (layer "F.Cu") + (net 15) + (uuid "f44f1bda-2e83-43d5-b028-0b41d317f4cc") + ) + (segment + (start 140.25 78.1625) + (end 140.25 79.75) + (width 0.2) + (layer "F.Cu") + (net 30) + (uuid "0c252c82-d60c-45e5-8e3b-590f49676b7f") + ) + (segment + (start 140.15 85.9) + (end 140.15 84.075) + (width 0.2) + (layer "F.Cu") + (net 30) + (uuid "11353363-f7ad-40ea-b9d5-d8388da7ecb0") + ) + (segment + (start 140.15 84.075) + (end 140.225 84) + (width 0.2) + (layer "F.Cu") + (net 30) + (uuid "22456065-e204-43b6-8f5e-0c2e5e5b13dd") + ) + (segment + (start 141 82.5) + (end 141 80.5) + (width 0.2) + (layer "F.Cu") + (net 30) + (uuid "3fc62bac-4d63-43e1-9881-e72edad01289") + ) + (segment + (start 140.225 83.275) + (end 141 82.5) + (width 0.2) + (layer "F.Cu") + (net 30) + (uuid "561e7ac4-aa96-4c5b-8c6e-62a77a5e8a09") + ) + (segment + (start 140.225 84) + (end 140.225 83.275) + (width 0.2) + (layer "F.Cu") + (net 30) + (uuid "7a2fc9bf-0b61-42b9-9152-fe5924acde61") + ) + (segment + (start 140.25 79.75) + (end 141 80.5) + (width 0.2) + (layer "F.Cu") + (net 30) + (uuid "9e081e8f-72bd-4ab2-a9a9-7734ea26684b") + ) ) From ae82a6519faf19226fad1b1530efa4ccf5b31640 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 13:42:54 -0700 Subject: [PATCH 31/41] Update getting_started_hierarchy_layout.md --- getting_started_hierarchy_layout.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/getting_started_hierarchy_layout.md b/getting_started_hierarchy_layout.md index 6409ca9b7..c813d1cbd 100644 --- a/getting_started_hierarchy_layout.md +++ b/getting_started_hierarchy_layout.md @@ -109,6 +109,8 @@ Group the switch cell footprints: select them, right click, Grouping > Group Ite ![pcb_switchmatrix_replicated.png](docs/kicad/pcb_switchmatrix_replicated.png) +4. You can re-replicate if you change the switch cell layout, it will update the other instances including clearing out the previous traces. + ### Option 2: KiCad Design Blocks _KiCad 10+ required._ @@ -141,7 +143,6 @@ _KiCad 10+ required._ ![kicad_designblocks_replicate.png](docs/kicad/kicad_designblocks_replicate.png) > This may shift the position of footprints and you may need to reposition the group. -7. Move the switch cell groups into the right positions. ### Snaking From cbd6a4a2005a7e3a5c298b0cbc2241e44381b895 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 14:01:27 -0700 Subject: [PATCH 32/41] Update reference.md --- reference.md | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/reference.md b/reference.md index 86ddbb98c..cc30be01b 100644 --- a/reference.md +++ b/reference.md @@ -84,6 +84,8 @@ self.connect(self.block1.port, self.block2.port, ...) - Optionally assign a name to the `Connection` by assigning to a `self` variable. - Connections must be between ports of compatible type. Typed ports (like `Ground` or `VoltageSink`) are distinct from `Passive` ports and not connectable without adapters. +- Only the block's ports and inner blocks' ports can be connected. + Connections cannot be made arbitrarily deep in the block hierarchy. #### Implicit Connection Blocks @@ -227,6 +229,35 @@ class CustomUartConnector(Block): - `PassiveConnector` is an abstract class for connectors with a parameterizable number of passive-typed pins, including 2.54mm headers, FPCs, and more. - `PassiveConnector.connected(...)` automatically adapts typed ports to the connector's Passive ports. +### Multipacking + +Multipacking allows multiple components, potentially spread across the design hierarchy, to be combined into one component. +This is an optimization that may save board area and cost. +Example: quad-pack resistor networks, dual-pack opamps, RGB LEDs. + +```python +class MyBoard(SimpleBoardTop): + def contents(self) -> None: + ... + + def multipack(self) -> None: + self.res_pack = self.PackedBlock(ResistorArray()) + self.pack(self.res_pack.elements.request('0'), ['led[0]', 'res']) + self.pack(self.res_pack.elements.request('1'), ['led[1]', 'res']) + self.pack(self.res_pack.elements.request('2'), ['led[2]', 'res']) + self.pack(self.res_pack.elements.request('3'), ['led[3]', 'res']) +``` + +- `multipack()` is a blend of `contents()` (in that `PackedBlocks` are declared within) and `refinements()` (in that it uses `List[str]` to reference blocks in the design hierarchy). +- `self.PackedBlock(...)` is similar to `self.Block(...)`. +- `self.pack(...)` takes two arguments: + - `multipack_part`: the multipack element that is part of the packed block, either a block or an element of a dynamically-sized packed block array. + - `path`: the path to the block which this replaces, as a list of strings. +- This remains correct ERC model-wise, elements of the packed block are modeled as being 'inside' the replaced block. +- Each multipack element has its own ports, including for shared pins like the common power pins of a dualpack opamp. + A compiler assertion checks that these are all connected to the same netlist net. +- Multipacking can only be defined at the BoardTop level. + ### Sub-boards and Connector Pairs Subboards are `Block`s that define a subcircuit that is its own board (generates a separate netlist). From 135d0d9fc22d3f3f9c521439b8aab66dd49af62c Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 14:02:57 -0700 Subject: [PATCH 33/41] Update reference.md --- reference.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/reference.md b/reference.md index cc30be01b..5a1f90e9e 100644 --- a/reference.md +++ b/reference.md @@ -237,15 +237,15 @@ Example: quad-pack resistor networks, dual-pack opamps, RGB LEDs. ```python class MyBoard(SimpleBoardTop): - def contents(self) -> None: - ... - - def multipack(self) -> None: - self.res_pack = self.PackedBlock(ResistorArray()) - self.pack(self.res_pack.elements.request('0'), ['led[0]', 'res']) - self.pack(self.res_pack.elements.request('1'), ['led[1]', 'res']) - self.pack(self.res_pack.elements.request('2'), ['led[2]', 'res']) - self.pack(self.res_pack.elements.request('3'), ['led[3]', 'res']) + def contents(self) -> None: + ... + + def multipack(self) -> None: + self.res_pack = self.PackedBlock(ResistorArray()) + self.pack(self.res_pack.elements.request('0'), ['led[0]', 'res']) + self.pack(self.res_pack.elements.request('1'), ['led[1]', 'res']) + self.pack(self.res_pack.elements.request('2'), ['led[2]', 'res']) + self.pack(self.res_pack.elements.request('3'), ['led[3]', 'res']) ``` - `multipack()` is a blend of `contents()` (in that `PackedBlocks` are declared within) and `refinements()` (in that it uses `List[str]` to reference blocks in the design hierarchy). From 441df437783754410c14ac40220ac9b950f30e57 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 14:08:16 -0700 Subject: [PATCH 34/41] Update reference.md --- reference.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/reference.md b/reference.md index 5a1f90e9e..0a117a427 100644 --- a/reference.md +++ b/reference.md @@ -122,6 +122,7 @@ with self.implicit_connect( #### .connected(...) Some (but far from all) blocks define a `.connected(...)` as a shorthand connection method, see each class's API for details. +These return the block itself, allowing it to be assigned to a name. ```python self.tp_gnd = self.Block(GroundTestPoint()).connected(self.gnd) @@ -290,7 +291,7 @@ Some of the electrical modeling may have overly strict limits or overly broad op ```python class_refinements=[ - (Neopixel, ["pwr", "voltage_limits"], Range(3.0, 5.5)), # mostly works fine at 3.3v + (Neopixel, ["pwr", "voltage_limits"], Range(3.0, 5.5)), # kinda works-ish at 3.3v ] ``` From 74f88b385efb82e171e8b331f60ad67341e28c67 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 14:08:53 -0700 Subject: [PATCH 35/41] Update reference_library.md --- reference_library.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reference_library.md b/reference_library.md index c821269b6..bcee0e14e 100644 --- a/reference_library.md +++ b/reference_library.md @@ -11,6 +11,8 @@ Also see the [top-level board design reference](reference.md). The library design experience is much less polished and more intricate than the top-level board design experience. +## Under Construction + ## Parameters - `BoolExpr`: boolean (true / false) variable From 3e2b74811c1babe4758a5f8aed7c2eb5530fb6b7 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 14:11:19 -0700 Subject: [PATCH 36/41] Update reference_library.md --- reference_library.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/reference_library.md b/reference_library.md index bcee0e14e..6c449aa00 100644 --- a/reference_library.md +++ b/reference_library.md @@ -13,6 +13,8 @@ The library design experience is much less polished and more intricate than the ## Under Construction +Parts of this reference are outdated. + ## Parameters - `BoolExpr`: boolean (true / false) variable From 886f747f231debacf9fe7bdeca7fb1bc4c70f02e Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 15:10:07 -0700 Subject: [PATCH 37/41] wip --- getting_started_advanced.md | 36 ++++++--------------- getting_started_optimization.md | 55 --------------------------------- 2 files changed, 9 insertions(+), 82 deletions(-) delete mode 100644 getting_started_optimization.md diff --git a/getting_started_advanced.md b/getting_started_advanced.md index df70ef2b5..c1060dcf4 100644 --- a/getting_started_advanced.md +++ b/getting_started_advanced.md @@ -1,7 +1,14 @@ # Getting Started Tutorial: Advanced Library Construction -_In this section, we will convert the four-LED array into an n-LED array block and go through the advanced constructs of generators and port arrays._ +_In this section, we will build a re-usable n-LED array Block, going through the advanced constructs of generators and port arrays._ -As a refresher, in the first part of the getting started tutorial, we dropped 4 LEDs directly in our top-level design sign with a `for` loop in: +> The IDE does not support graphical operations for programmatic constructing circuits. +> However, you can continue to use the IDE for visualization. + + +## The Naive (but Broken) Approach + +The HDL provides the ElementDict construct for giving unique names to a dynamically-sized array of blocks. +An array of LEDs looks like: ```python self.led = ElementDict[IndicatorLed]() for i in range(4): @@ -9,14 +16,6 @@ for i in range(4): ... ``` -However, arrays of LEDs are common enough that they would make sense as a library block, and it would condense these three lines of code here into just one. - -> The IDE does not support graphical operations for programmatic constructing circuits. -> However, you can continue to use the IDE for visualization. - - -## The Naive (but Broken) Approach - You might be tempted to drop the above into a Block and pipe the `int` through as a constructor argument: ```python # DON'T DO THIS - THIS WON'T WORK @@ -189,18 +188,6 @@ class BlinkyExample(SimpleBoardTop): self.connect(self.mcu.gpio.request_vector('led'), self.led.ios) ``` -Or, since we added the implicit tag `Input` to the IOs port, we can use `chain` to combine the instantiation and connection: -```python -class BlinkyExample(SimpleBoardTop): - def contents(self) -> None: - ... - with self.implicit_connect( - ... - ) as imp: - ... - (self.led, ), _ = self.chain(self.mcu.gpio.request_vector('led'), imp.Block(LedArray(4))) -``` - As shown above, port arrays can be directly connected together to make parallel connections, and we can request sub-arrays from a port array. When connecting port arrays together, exactly one must define the array width, which is automatically propagated to the others in the connection. As a result, the single LED count parameter also drives the connection width and the pins requested from the microcontroller. @@ -235,11 +222,6 @@ class BlinkyExample(SimpleBoardTop): ``` - -## Board Optimization - -Continue to [the next part of the tutorial](getting_started_optimization.md) on optimizing the board using packed components. - ### Additional Resources Check out these examples of generators: - [Charlieplexing LED generator](examples/test_ledmatrix.py): a much more advanced version of the LED array that minimizes IO pins to drive LEDs, by allowing one IO pin to drive both a column and row of LEDs. diff --git a/getting_started_optimization.md b/getting_started_optimization.md deleted file mode 100644 index 6f8ade281..000000000 --- a/getting_started_optimization.md +++ /dev/null @@ -1,55 +0,0 @@ -# Getting Started: Optimization -_This short tutorial puts the finishing touches on your design, by multipacking the resistors into a quad-pack device._ - - -## Multipack -_Multipacking allows multiple components, potentially spread across the design hierarchy, to be combined into one component._ -_This is an optimization that may save board area and cost._ - -### Creating Packed Blocks -Multipacking in our HDL model is similar to refinements in that it is a top-level design operation and targets parts that can be anywhere in the design hierarchy. -Multipacking starts by defining a PackedBlock: - -```python -class BlinkyExample(SimpleBoardTop): - ... - def multipack(self) -> None: - self.res_pack = self.PackedBlock(ResistorArray()) -``` - -> The `multipack()` method is similar to `contents()` in that you can create and pack `PackedBlock`s in there, similar to how you create and connect normal `Block`s. -> `self.PackedBlock(...)` also behaves similarly to `self.Block(...)` - -### Packing Blocks -With a packed block, you can now fill its parts with blocks from across the design hierarchy: - -```python -class BlinkyExample(SimpleBoardTop): - ... - def multipack(self) -> None: - self.res_pack = self.PackedBlock(ResistorArray()) - self.pack(self.res_pack.elements.request('0'), ['led', 'led[0]', 'res']) - self.pack(self.res_pack.elements.request('1'), ['led', 'led[1]', 'res']) - self.pack(self.res_pack.elements.request('2'), ['led', 'led[2]', 'res']) - self.pack(self.res_pack.elements.request('3'), ['led', 'led[3]', 'res']) -``` - -> `self.pack(...)` takes two arguments, the first is the part in the `PackedBlock`, and the second is the `Block` in the design hierarchy to be backed. -> Since `Block`s arbitrarily deep in the design hierarchy may not be known when the top-level HDL is initially compiled, this is specified as a path as a list of strings. - -> Packed blocks can have parts that are either single instances or arrays. -> The above is an example of a part array, which similar to port arrays are dynamically sized and can be `request`ed from. -> Like port arrays, even though they are dynamically sized, there may be restrictions from what parts are available, for example you'd be hard-pressed to find an 8-resistor array anywhere. - -If you import this into KiCad, you should be able to see the quad-pack resistor instead of single resistors per LED. -Here, it is shown on the bottom left, next to the switch: -![Packed layout with default placement](docs/packed_kicad.png) - - -## Definition - -Creation of multipack devices is current out of the scope of this tutorial series. -However, you can see some examples: -- [Resistor array](electronics_abstract_parts/AbstractResistorArray.py): how the resistor array used above is implemented, though this is a base class intended to be subclassed by a parts table parser. -- [RGB LED](electronics_abstract_parts/AbstractLed.py): an RGB LED packed from individual discrete LED, that also show how shared pins can be handled. - This is also an example of a `PackedBlock` that uses single instance parts, the component R, G, and B LEDs. From a4157c485fe22f42352ee3db14b15f48fb20bc5d Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 15:37:57 -0700 Subject: [PATCH 38/41] cleanup --- getting-started.md | 9 ++++++--- getting_started_hierarchy_layout.md | 2 +- reference.md | 9 +++++++++ 3 files changed, 16 insertions(+), 4 deletions(-) diff --git a/getting-started.md b/getting-started.md index eeea70795..7509d91cd 100644 --- a/getting-started.md +++ b/getting-started.md @@ -296,7 +296,7 @@ If using the IDE: the compiled block diagram should look like: If you have KiCad installed, you can import the design into the layout editor. _KiCad 6.0+ is required, the netlist format is not compatible with 5.x or lower!_ -This example needs the Seeed Studio KiCad footprint library: https://github.com/Seeed-Studio/OPL_Kicad_Library +The example-so-far needs the Seeed Studio KiCad footprint library: https://github.com/Seeed-Studio/OPL_Kicad_Library Don't worry about installing it, in a few sections this will be replaced with a standard STM32. In the KiCad standalone PCB Editor (layout tool), go to File > Import > Netlist..., and open the netlist file generated. @@ -627,7 +627,7 @@ While `IoController` automatically assigns IO pinnings according to the capabili However, it does define a `pin_assigns` parameter (as an array-of-strings) which allows specifying a pin number (on the footprint) or pin name (eg, `GPIO3` - format specific to each microcontroller) for each requested pin. We can also force parameter values through the refinements system, using `instance_values`. -Let's arbitrarily choose pins 26-29 for the LEDs. +Let's arbitrarily choose sequential pins: **Add a pin assignment for the STM32 in the refinements section**: ```diff class BlinkyExample(SimpleBoardTop): @@ -649,9 +649,12 @@ Let's arbitrarily choose pins 26-29 for the LEDs. ]) ``` +Each pin assignment entry is specified as `pin=num`. +`pin` is the name of the requested pin (the `request(...)` argument for single element requests, or the argument plus a `_index` for vector requests). + ## Next: Hierarchical Layout -Continue to the [hierarchical layout tutorial](getting_started_hierarchy_layout.md) for using the hierarchical netlist to help with reuse in board layout. +Continue to the [hierarchical layout tutorial](getting_started_hierarchy_layout.md) for importing the generated netlist into KiCad PCB layout and using the hierarchical structure to speed up layout through reuse. Or, continue to [the library block definition tutorial using KiCad schematic import](getting_started_schimport.md). diff --git a/getting_started_hierarchy_layout.md b/getting_started_hierarchy_layout.md index c813d1cbd..a5ca9cd63 100644 --- a/getting_started_hierarchy_layout.md +++ b/getting_started_hierarchy_layout.md @@ -18,7 +18,7 @@ For hierarchical loading and replication, you have a few options: ![Sublayout](docs/kicad/pcm_sublayout.png) - This was designed to work with netlist-based flows and automatically detects grouping based on hierarchy data in the netlist. - - This works with KiCad 10+, but zone replication is broken. + - This works with KiCad 10+, but zones will not be replicated. - Use KiCad's native design blocks feature (KiCad 10+). - This tutorial covers hierarchical replication, but hierarchical loading is not covered. - The design blocks flow is heavyweight (requires local library creation) and (at least for netlist driven flows, like this one) requires you to group footprints within a block manually. diff --git a/reference.md b/reference.md index 0a117a427..70f263f58 100644 --- a/reference.md +++ b/reference.md @@ -182,6 +182,14 @@ self.connect(self.mcu.gpio.request("led"), self.led.signal) - `IoController`s have a `gnd` and `pwr` input power ports, and `gpio`, `adc`, `spi`, `i2c`, `uart`, and `usb` Vector IO ports which elements can be requested from. - Not all `IoController`s support all IO types, see each class's API for details. - The `request(...)` name is used in the `pin_assigns` refinement, with each entry specified as either `led=3` (by footprint pin number) or `led=GPIO4` (by IO name, see each class's API for details). +- These request types are available, and their pin assignment entries are: + + | Request Type | Request Syntax | Pin Assignment Entries | + |-------------------------|------------------------------------------|--------------------------------------------------------| + | Single Element | `self.mcu.gpio.request("my_io")` | `"my_io=3"` | + | Vector | `self.mcu.gpio.request_vector("my_ios")` | `"my_ios_0=3", "my_ios_1=4", ...` (underscore-indexed) | + | Bundle (e.g., SPI, I2C) | `self.mcu.spi.request("my_spi")` | `"my_spi.sck=3", "my_spi.mosi=4", ...` (dot-indexed) | + | Unnamed | `self.mcu.gpio.request()` | Arbitrarily named, don't rely on this | ### Mixins @@ -281,6 +289,7 @@ class LedSubboard(SubboardBlock): - These use a `SubboardConnectorPair` block (like `Fpc050SocketTabPair`) to define the physical connector pair. - `SubboardConnectorPair` are similar to `PassiveConnector`, with `Passive` typed ports. - Typed ports (like `Ground` or `VoltageSink`) internally contain a `Passive` `net` which can be attached to the connector's `Passive` ports. + - `self.Export(...)` creates a Port on the Block that is connected to (and takes on the type) of the inner port. - `self.export_tap` behaves similar to `self.connect`, but attaches the inner port to the outer port without propagating parameter values (non-physical attachment). Conceptually, the connector taps onto (or hangs off) the parameter-propagating Export connection. From 62dfe2626ca62794a42d5f0bc24fabdfdfb77f99 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 15:39:25 -0700 Subject: [PATCH 39/41] Update reference.md --- reference.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/reference.md b/reference.md index 70f263f58..7a5dccdf4 100644 --- a/reference.md +++ b/reference.md @@ -179,7 +179,7 @@ self.mcu = imp.Block(IoController()) self.connect(self.mcu.gpio.request("led"), self.led.signal) ``` -- `IoController`s have a `gnd` and `pwr` input power ports, and `gpio`, `adc`, `spi`, `i2c`, `uart`, and `usb` Vector IO ports which elements can be requested from. +- `IoController`s have `gnd` and `pwr` input power ports, and `gpio`, `adc`, `spi`, `i2c`, `uart`, and `usb` Vector IO ports which elements can be requested from. - Not all `IoController`s support all IO types, see each class's API for details. - The `request(...)` name is used in the `pin_assigns` refinement, with each entry specified as either `led=3` (by footprint pin number) or `led=GPIO4` (by IO name, see each class's API for details). - These request types are available, and their pin assignment entries are: From 012f4e0b009770bf52cfb1234e9ab863b8cf5b5c Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 16:01:09 -0700 Subject: [PATCH 40/41] wip --- edg/vendor_parts/{TactileSwitches.py => Switches.py} | 0 edg/vendor_parts/__init__.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename edg/vendor_parts/{TactileSwitches.py => Switches.py} (100%) diff --git a/edg/vendor_parts/TactileSwitches.py b/edg/vendor_parts/Switches.py similarity index 100% rename from edg/vendor_parts/TactileSwitches.py rename to edg/vendor_parts/Switches.py diff --git a/edg/vendor_parts/__init__.py b/edg/vendor_parts/__init__.py index 4c796faee..d27aa3eb0 100644 --- a/edg/vendor_parts/__init__.py +++ b/edg/vendor_parts/__init__.py @@ -3,7 +3,7 @@ from . import jlcparts from .generic import * -from .TactileSwitches import SmtSwitch, SmtSwitchRa, KailhSocket +from .Switches import SmtSwitch, SmtSwitchRa, KailhSocket from .Leds import SmtLed, ThtLed, Smt0606RgbLed, Smt0404RgbLed, ThtRgbLed from .CeramicResonator_Cstne import Cstne From 8ee0b2677186edd49eab67ef8aa9a8536e979888 Mon Sep 17 00:00:00 2001 From: Richard Lin Date: Sat, 4 Jul 2026 16:09:41 -0700 Subject: [PATCH 41/41] cleaning --- getting_started_advanced.md | 2 +- reference_library.md | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/getting_started_advanced.md b/getting_started_advanced.md index c1060dcf4..73604eeba 100644 --- a/getting_started_advanced.md +++ b/getting_started_advanced.md @@ -1,7 +1,7 @@ # Getting Started Tutorial: Advanced Library Construction _In this section, we will build a re-usable n-LED array Block, going through the advanced constructs of generators and port arrays._ -> The IDE does not support graphical operations for programmatic constructing circuits. +> The IDE does not support graphical operations for programmatic circuit construction. > However, you can continue to use the IDE for visualization. diff --git a/reference_library.md b/reference_library.md index 6c449aa00..ff018df3f 100644 --- a/reference_library.md +++ b/reference_library.md @@ -20,7 +20,7 @@ Parts of this reference are outdated. - `BoolExpr`: boolean (true / false) variable - Supports standard boolean operations - `FloatExpr`: numeric variable - - Suppers standard numeric operations + - Supports standard numeric operations - `RangeExpr`: range (interval) variable - Supports standard numeric operations (multiplication and division are undefined), some set operations (`.within(other)`, `.contains(other)`, `.intersect(other)`), and get operations (`.lower()`, `.upper()`) - `StringExpr`: string (text) variable @@ -67,7 +67,7 @@ These can be called inside `contents()`: - Elements are chained from left (outputs) to right (inputs) - The first argument to chain may be a port or block with an `InOut` or `Output`-tagged port. - Middle elements must be a block with an `InOut`-tagged port, or `Input`- and `Output`-tagged ports. - - The last argument to chain may be a port or block with an `InOut` or `Input`-tageed port. + - The last argument to chain may be a port or block with an `InOut` or `Input`-tagged port. - Assign names to components by assigning the object to a `self` variable: - `self.subblock_name = self.Block(BlockType(...))` - `(self.subblock_name1, self.subblock_name2, ...), self.chain_name = self.chain(...)` @@ -92,17 +92,17 @@ These can be called inside `contents()`: ### Single-wire Ports - `VoltageLink`: voltage rail - - `VoltageSource(voltage_out, current_limits)`: voltage source + - `VoltageSource(voltage, current_limits)`: voltage source - `VoltageSink(voltage_limits, current_draw)`: voltage sink (power input) - `DigitalLink`: low-speed (up to ~100 MHz) digital signals, modeling voltage limits and input / output thresholds - - `DigitalSource(voltage_out, current_limits, output_thresholds)`: digital output-only pin + - `DigitalSource(voltage, current_limits, output_thresholds)`: digital output-only pin - `output_thresholds` is the range of (maximum low output, minimum high output) - `DigitalSink(voltage_limits, current_draw, input_thresholds)`: digital input-only pin - `input_thresholds` is the range of (maximum low input, minimum high input) - `DigitalBidir(...)`: digital bidirectional (eg, GPIO) pin - Has all arguments of `DigitalSource` and `DigitalSink` - `AnalogLink`: analog signal that models input and output impedance - - `AnalogSource(voltage_out, current_limits, impedance)`: analog output + - `AnalogSource(voltage, current_limits, impedance)`: analog output - `AnalogSink(voltage_limits, current_draw, impedance)`: analog signal input - `PassiveLink`: connected copper that contains no additional data - `Passive`: single wire port that contains no additional data, but can be adapted to other types (eg, with `.as_voltage_source(...)`).