variant¶
The variant
statement provides the flexibility for the design to have variations on the components used. Each variant
is identified with its name. The apply-variants
command takes a list of variant names and applies them to create the variation specified for the design.
Syntax¶
pcb-module my-module :
port power
inst dnp-me : my-component
inst my-res : my-resistor(1000.0)
; Change component status
variant "DNP" :
; Change component status
do-not-populate(dnp-me)
instance-status(dnp-me) :
board-status = NotOnBoard
; Switch the component of an instance
variant "High Resistance" :
component(my-res) = my-resistor(1.0e06)
; Change property "voltage" of a pin
variant "High Power" :
state(power.voltage) = "high"
; Change property "rated-temperature" of the instance my-inst
variant "TOUGH Fuse" :
property(my-inst.rated-temperature) = min-max(-40.0 85.0)
; Apply Variants
val variation = apply-variants(["DNP" "High Power" "High Resistance"] my-module)
set-main-module(variation)
Description¶
variant "variant name" :
Specifies a Variant that may alter the inst in this module.
Its application is determined by a command apply-variants
later in top level.
For example, if later on, a top level command
val new-module = apply-variants(["DNP" "High Power"] my-module)
is executed, the inst
dnp-me
will become do-not-populate
and power
pin will have 5V in new-module
.
The following statements are supported within a variant
statement:
* instance-status
and do-not-populate
statements modify the on-board and BOM statuses of components.
* state
and property
statements modify the property/state of an instance
* component
statement replaces the component of an instance by another component, provided they have the same landpattern.
Example Code¶
#use-added-syntax(jitx)
defpackage my-design :
import core
import jitx
import jitx/commands
import jitx/emodels
import ocdb/utils/defaults
import ocdb/utils/landpatterns
; smd-pad, also needs default rules in ocdb/utils/defaults
pcb-component my-component :
name = "my component"
property(self.rated-temperature) = min-max(-55.0 125.0)
pcb-landpattern my-landpattern :
pad a : smd-pad(Circle(1.0)) at loc(0.0, 0.0) on Top
;pad a : square-pad at loc(0.0, 0.0) on Top
layer(SolderMask(Top)) = Rectangle(1.25, 1.25)
pcb-component my-resistor (resistance:Double):
emodel = Resistor(resistance)
assign-landpattern(my-landpattern)
pcb-module main:
port gnd
port power
port signal
; Change component status
public inst my-inst : my-component
variant "DNP" :
do-not-populate(my-inst)
instance-status(my-inst) :
board-status = NotOnBoard
; Switch the component of an instance to another one with the same landpattern
public inst my-res : my-resistor(10.0e3)
variant "High Resistance":
component(my-res) = my-resistor(10.0e6)
; Change property "voltage" of the pin power
property(power.voltage) = Stateful(["low" => 1.8, "medium" => 3.3, "high" => 5.0])
state(power.voltage) = "low"
variant "High Power" :
state(power.voltage) = "high"
variant "Medium Power" :
state(power.voltage) = "medium"
; Change property "rated-temperature" of the instance fuse
variant "TOUGH Fuse" :
property(my-inst.rated-temperature) = min-max(-40.0 85.0)
; Apply Variants
val variation = apply-variants(["DNP" "High Power" "High Resistance"] main)
set-main-module(variation)
; Verify the variants are properly applied
println $ do-not-populate?(variation.my-inst)
println $ state(variation.power.voltage)
println $ emodel?(variation.my-res)
The output of the above code would be
true
high
Resistor(10000000.0)