Class, subclass and replace¶
Class and subclass¶
Like classes in most modern languages, we can subclass and inherit from blocks.
some_variable = "some value"
module SubclassedModule from SomeModule:
# inherits all the signals and variables from SomeModule
# we don't need to declare the signals again,
# but we will replace the value of some_variable
some_variable = "some other value"
# creates an instance of the SubclassedModule
subclased_module = new SubclassedModule
# connects the some_signal of the SubclassedModule to the gnd of Test
subclased_module.gnd ~ gnd
note: we can subclass a module as a component, but not the other way around. A component is expected to represent a specific component.
This subclassing is also useful for creating typed interfaces:
-> the replace operator¶
This operator allows you to increase the specificity of a block somewhere.
Take the following example: 1. You want to create a reusable half-bridge module 2. If you spec the FETs within the module, you can't readily reuse the design in other projects with other FETs 3. If you don't declare the FETs at the bottom level it's a PITA to use, since every time you use it you need to remember to slot the FET in the right spot
You want some way to say "we're putting a FET here, but we'll tell you which FET later"
Subclassing is the way you say what a FET is, the replacement operator gives you the later.
high_fet = new NFET
low_fet = new NFET
# let's pretend we do something useful here like hook it all up
# some time later... perhaps in another file
component SomeNFET from NFET:
footprint = "TO-220-3_Vertical"
# this isn't a legit package, but you get the idea
a = new HalfBridge
# replace the fets with a SomeNFET
a.high_fet -> SomeNFET
a.low_fet -> SomeNFET