Next: , Previous: Top-level circuits, Up: Tutorial


2.2 Subcircuits

Process definitions are emitted as subcircuit definitions, and can be instantiated with the SPICE X card.

Write the following HAC file, inv-def.hac:

     defproc inv(bool x, y) {
     prs {
       x => y-
     }
     }

Compile the source to an object file as before. Since there are no top-level instances, you'll need to tell hacknet what type to emit as the top subcircuit.

     $ hacknet -T 'inv' inv-def.haco-c

should produce:

     .subckt inv<> !GND !Vdd x y
     My:dn:0 !GND x y !GND nch W=5u L=2u
     My:up:0 !Vdd x y !Vdd pch W=5u L=2u
     .ends

Use of single-quotes around the type argument is encouraged (in fact, only required for template parameters to protect the <> characters from being interpreted by the shell).

Finally, entire hierarchal netlists can be produced by instantiating subcircuit definitions. Write the following file invs.hac, and compile it into invs.haco-c:

     import "inv-def.hac";
     
     // pair of inverters
     defproc foo(bool a, b, c) {
     inv p(a, b), q(b, c);
     }
     
     foo bar;

Run hacknet:

     $ hacknet invs.haco-c > invs.spice

to produce the following hierarchical netlist.

     .subckt inv<> !GND !Vdd x y
     My:dn:0 !GND x y !GND nch W=5u L=2u
     My:up:0 !Vdd x y !Vdd pch W=5u L=2u
     .ends
     
     .subckt foo<> !GND !Vdd a b c
     xp !GND !Vdd a b inv<>
     xq !GND !Vdd b c inv<>
     .ends
     
     xbar !GND !Vdd bar.a bar.b bar.c foo<>

In this example, there is a top-level instance of type foo named bar.