Module Level Statements¶
A pcb-module statement defines a circuit made up of component instances and the connections between the ports of each instance. The pcb-module can be thought of as the circuit organization tool for building hierarchical circuits. In addition to defining the circuit net list, the pcb-module can also define physical geometry and the positioning of instances in the board view with respect to the module's kinematic frame.
The pcb-module is similar to the module in Verilog. If you are coming from VHDL, you will find that it is similar in ways to the entity concept except there is no way to provide multiple architecture bodies for a JITX pcb-module.
The pcb-module statement is valid in all contexts of a JITX design.
Signature¶
pcb-module mod-name (arg1:Type1, ...) :
name = <String>
description = <String|False>
; Other module statements here
The expression name mod-name uniquely identifies this module definition
in the current context.
The argument list (arg1:Type1, ...) is optional and provides a means of constructing parameterized module definitions. The arguments in this list must be of type JITXValue.
There are many statements associated with the pcb-module definition. See the Statements section below for a detailed listing.
Minimal pcb-module Definition¶
All statements for a pcb-module are optional. Here is an example of the most minimal pcb-module definition:
pcb-module minimal:
false
This is clearly not very useful - but demonstrates the point and it will compile.
One thing to notice is that indentation for the module definition's statements is required. Here the only statement is a value expression of false.
The indentation must be in the form of [spaces]. A tab character will cause a syntax error.
Usage¶
The pcb-module definition is quite versatile. It is typically used in the following conditions:
- Defining the top-level for a circuit design. See Design Hierarchy for more info.
- Defining reusable or one-off sub-circuits in a design.
- Constructing a wrapper around a
pcb-componentinstance.
Example Top-Level Design¶
val board-shape = RoundedRectangle(60.0, 40.0, 1.6)
pcb-module top-level :
inst MCU : RP2040
require bus:i2c from MCU
inst accelerometer : MMA8451Q
inst temp-sensor : TMP116
net GND (MCU.GND, accelerometer.rail.V-, temp-sensor.rail.V-)
net I2C (bus, accelerometer.bus, temp-sensor.bus)
...
geom(GND):
copper-pour(LayerIndex(1), isolate = 0.125, rank = 1) = board-shape
copper-pour(LayerIndex(4), isolate = 0.125, rank = 1) = board-shape
Common Traits:
- For top-level design modules, you will often find multiple
inststatements constructing the sub-circuit and components of a design. - Top-level modules typically don't have
portdefinitions. They can but it often isn't useful because the off-board interfaces are typically through connectors. - It is very common to see many
requirestatements that construct the pin assignment problem for the circuit. - Top-level modules typically have
geomstatements to contruct large-scale features of a design, like ground planes and keepout regions.
Example Reusable Circuit¶
pcb-module LDO (comp:Instantiable, Vin:Double, Vout:Double) :
port vin : power
port vout : power
inst ldo : comp
net (vin.V+, ldo.VIN)
net (vin.V-, vout.V-, ldo.GND)
net (vout.V+, ldo.VOUT)
bypass-cap-strap(ldo.VIN, ldo.GND, 1.0e-6)
bypass-cap-strap(ldo.VOUT, ldo.GND, 1.0e-6)
; Construct Voltage divider here.
inst div : voltage-divider(typ(Vin), typ(Vout))
net (div.in, ldo.VOUT)
net (div.out, ldo.FB)
net (div.lo, ldo.GND)
Common Traits:
- Reusable
pcb-moduledefinitions are typically parametric - Arguments are used to configure how those circuits behave - eg, what voltage to output.
- Some arguments might provide an
Instantiable- meaning a component or module definition that will be instantiated inside this module. - They will typically have standardized
portinterfaces using bundles. - They will typically use other lower level primitives to build up more complex features.
Example Component Wrappers¶
pcb-module MMA8451Q :
port bus : i2c
port rail : power
public inst comp : MMA8451Q-component
bypass-cap-strap(comp.VDD, comp.GND, 4.7e-6)
bypass-cap-strap(comp.BYP, comp.GND, 0.1e-6)
bypass-cap-strap(comp.VDDIO, comp.GND, 0.1e-6)
...
Common Traits:
- Module wrappers around components are typically useful to encapsulate component specific features.
- For example, specific bypass capacitor specs per the components datasheets.
- Configuration resistor strapping, which may require parametric arguments.
- Module wrappers are typically very specific to a particular component.
- It is common to make the wrapped component
publicas a way to interrogate it from the parent context. - These wrappers are often useful for using language features that are not present in the
pcb-componentdefinition context.
Statements¶
Here is the list of all of the statements you can use in a pcb-module :
| Statement | Description |
|---|---|
#CHECK |
Assertion Checks |
description |
Description |
do-not-populate |
Do not Populate |
eval-when |
Eval When |
geom |
Custom copper geometry |
insertion-loss |
Add a Timing Difference Constraint - Topology |
inst |
Instantiate a component or module |
instance-status |
Instance Status |
layer |
Layer |
layout-group |
Layout Group |
name |
Name |
net |
Create an electrical connection |
no-connect |
Set a port as "Not Connected" |
node |
Node |
pin-properties |
Pin Properties Table |
place |
Set a component or module's pose |
ports |
Ports |
reference-designator |
Reference Designator Assignment |
require |
Require - Pin Assignemnt |
restrict |
Restrict - Pin Assignemnt |
ref-label |
Ref Label Assignment |
schematic-group |
Schematic Group |
short-trace |
Short Trace |
structure |
Structure - Topology |
supports |
Supports - Pin Assignemnt |
symbol |
Net Symbol Assignment |
timing |
Add a Timing Constraint - Topology |
timing-difference |
Add a Timing Difference Constraint - Topology |
topology |
Label a Topology |
topology-segment |
Construct an SI route - Topology |
value-label |
Value Label Assignment |
variant |
BOM Variant Definitions |