Packages
A Virdant design may be split across multiple files. When doing so, each file is a Virdant package.
One Virdant package may import another using the import
keyword:
1import buffer;
2
3mod Top {
4 incoming clock : Clock;
5 outgoing out : Word[4];
6
7 reg counter : Word[4] on clock;
8 counter <= counter->inc();
9
10 mod buffer of buffer::Buffer;
11 buffer.clock := clock;
12 buffer.inp := counter;
13
14 wire counter_is_zero : Bit;
15 counter_is_zero := counter->eq(0);
16
17 out := if counter_is_zero {
18 0
19 } else {
20 buffer.out
21 };
22}
The first line, import buffer
, will tell Virdant that it needs to import the buffer
package.
This will be located in another file, buffer.vir
:
1mod Buffer {
2 incoming clock : Clock;
3 incoming inp : Word[4];
4 outgoing out : Word[4];
5
6 reg queue : Word[4] on clock;
7 queue <= inp;
8
9 out := queue;
10}
When we want to use a module definition, type definition, or other declaration from another package, we refer to it by its fully-qualified name.
In this example, we see:
mod buffer of buffer::Buffer;
The module definition is named with the fully-qualified name buffer::Buffer
.