A hardware description language. Schematic blocks can be designed in Kicad and combined with code. I plan to use this when I design a relay computer.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

63 lines
2.0 KiB

extern module and("and.sch"); # a kicad schematic in the same directory which defines some input/output signals and wires them together in some way
extern module or("or.sch"); # same thing, but for or
extern module xor("xor.sch");
# a binary half adder
module half_adder(input a, input b, output sum, output carryOut)
{
xor(a, b, sum);
and(a, b, carryOut);
}
# a binary full adder
module full_adder(input a, input b, input carryIn, output sum, output carryOut)
{
signal sum1;
signal carry1;
signal carry2;
half_adder(a, b, sum1, carry1);
half_adder(sum1, carryIn, sum, carry2);
or(carry1, carry2, carryOut);
}
# a byte full adder
# takes in busses(arrays of signals)
module byte_adder(input A[0:8], input B[0:8], input carryIn, output Sum[0:8], output carryOut)
{
signal Carries[0:7];
full_adder(A[0], B[0], carryIn, Sum[0], Carries[0]);
full_adder(A[1], B[1], Carries[0], Sum[1], Carries[1]);
full_adder(A[2], B[2], Carries[1], Sum[2], Carries[2]);
full_adder(A[3], B[3], Carries[2], Sum[3], Carries[3]);
full_adder(A[4], B[4], Carries[3], Sum[4], Carries[4]);
full_adder(A[5], B[5], Carries[4], Sum[5], Carries[5]);
full_adder(A[6], B[6], Carries[5], Sum[6], Carries[6]);
full_adder(A[7], B[7], Carries[6], Sum[7], carryOut);
}
# this is what gets converted into a schematic
# it's just a re-export of the byte adder.
module main(input A[0:8], input B[0:8], input cIn, output Sum[0:8], output cOut)
{
byte_adder(A, B, cIn, Sum, cOut);
}
# tests (TODO)
# we need to define how and, or, xor work
# compiler will look at the signals to figure out what are inputs and what are outputs
## expect and(0, 0, 0);
## expect and(0, 1, 0);
## expect and(1, 0, 0);
## expect and(1, 1, 1); # can also write `expect and(HIGH, HIGH, HIGH)` - HIGH = 1 and LOW = 0; The compiler doesn't care
## test "adder works" # start with "test", then the name of the test case
## {
## signal Sum[0:7];
## signal cOut;
## # numbers are automatically converted into bus values
## byte_adder(2, 3, LOW, Sum, cOut);
## assert_equal(5, Sum);
## assert_equal(LOW, cOut);
## }