In [1]:
import magma as m
import mantle
def DefineAdder(N):
T = m.UInt[N]
class Adder(m.Circuit):
name = "Adder{}".format(N)
IO = ["I0", m.In(T), "I1", m.In(T), "CIN", m.In(m.Bit),
"O", m.Out(T), "COUT", m.Out(m.Bit)]
@classmethod
def definition(io):
adders = [mantle.FullAdder() for _ in range(N)]
adders = m.fold(adders, foldargs={"CIN":"COUT"})
COUT, O = adders(I0=io.I0, I1=io.I1, CIN=io.CIN)
m.wire(O, io.O)
m.wire(COUT, io.COUT)
return Adder
Adder4 = DefineAdder(4)
In [2]:
print(repr(Adder4))
Adder4 = DefineCircuit("Adder4", "I0", In(UInt[4]), "I1", In(UInt[4]), "CIN", In(Bit), "O", Out(UInt[4]), "COUT", Out(Bit))
FullAdder_inst0 = FullAdder()
FullAdder_inst1 = FullAdder()
FullAdder_inst2 = FullAdder()
FullAdder_inst3 = FullAdder()
wire(Adder4.I0[0], FullAdder_inst0.I0)
wire(Adder4.I1[0], FullAdder_inst0.I1)
wire(Adder4.CIN, FullAdder_inst0.CIN)
wire(Adder4.I0[1], FullAdder_inst1.I0)
wire(Adder4.I1[1], FullAdder_inst1.I1)
wire(FullAdder_inst0.COUT, FullAdder_inst1.CIN)
wire(Adder4.I0[2], FullAdder_inst2.I0)
wire(Adder4.I1[2], FullAdder_inst2.I1)
wire(FullAdder_inst1.COUT, FullAdder_inst2.CIN)
wire(Adder4.I0[3], FullAdder_inst3.I0)
wire(Adder4.I1[3], FullAdder_inst3.I1)
wire(FullAdder_inst2.COUT, FullAdder_inst3.CIN)
wire(FullAdder_inst0.O, Adder4.O[0])
wire(FullAdder_inst1.O, Adder4.O[1])
wire(FullAdder_inst2.O, Adder4.O[2])
wire(FullAdder_inst3.O, Adder4.O[3])
wire(FullAdder_inst3.COUT, Adder4.COUT)
EndCircuit()
In [3]:
m.compile("build/Adder4", Adder4, output="coreir")
%cat build/Adder4.json
{"top":"global.Adder4",
"namespaces":{
"global":{
"modules":{
"Adder4":{
"type":["Record",[
["I0",["Array",4,"BitIn"]],
["I1",["Array",4,"BitIn"]],
["CIN","BitIn"],
["O",["Array",4,"Bit"]],
["COUT","Bit"]
]],
"instances":{
"FullAdder_inst0":{
"modref":"global.FullAdder"
},
"FullAdder_inst1":{
"modref":"global.FullAdder"
},
"FullAdder_inst2":{
"modref":"global.FullAdder"
},
"FullAdder_inst3":{
"modref":"global.FullAdder"
}
},
"connections":[
["self.CIN","FullAdder_inst0.CIN"],
["FullAdder_inst1.CIN","FullAdder_inst0.COUT"],
["self.I0.0","FullAdder_inst0.I0"],
["self.I1.0","FullAdder_inst0.I1"],
["self.O.0","FullAdder_inst0.O"],
["FullAdder_inst2.CIN","FullAdder_inst1.COUT"],
["self.I0.1","FullAdder_inst1.I0"],
["self.I1.1","FullAdder_inst1.I1"],
["self.O.1","FullAdder_inst1.O"],
["FullAdder_inst3.CIN","FullAdder_inst2.COUT"],
["self.I0.2","FullAdder_inst2.I0"],
["self.I1.2","FullAdder_inst2.I1"],
["self.O.2","FullAdder_inst2.O"],
["self.COUT","FullAdder_inst3.COUT"],
["self.I0.3","FullAdder_inst3.I0"],
["self.I1.3","FullAdder_inst3.I1"],
["self.O.3","FullAdder_inst3.O"]
]
},
"FullAdder":{
"type":["Record",[
["I0","BitIn"],
["I1","BitIn"],
["CIN","BitIn"],
["O","Bit"],
["COUT","Bit"]
]],
"instances":{
"Or3xNone_inst0":{
"modref":"global.Or3xNone"
},
"and_inst0":{
"modref":"corebit.and"
},
"and_inst1":{
"modref":"corebit.and"
},
"and_inst2":{
"modref":"corebit.and"
},
"fold_xor3None_inst0":{
"modref":"global.fold_xor3None"
}
},
"connections":[
["and_inst0.out","Or3xNone_inst0.I0"],
["and_inst1.out","Or3xNone_inst0.I1"],
["and_inst2.out","Or3xNone_inst0.I2"],
["self.COUT","Or3xNone_inst0.O"],
["self.I0","and_inst0.in0"],
["self.I1","and_inst0.in1"],
["self.I1","and_inst1.in0"],
["self.CIN","and_inst1.in1"],
["self.I0","and_inst2.in0"],
["self.CIN","and_inst2.in1"],
["self.I0","fold_xor3None_inst0.I0"],
["self.I1","fold_xor3None_inst0.I1"],
["self.CIN","fold_xor3None_inst0.I2"],
["self.O","fold_xor3None_inst0.O"]
]
},
"Or3xNone":{
"type":["Record",[
["I0","BitIn"],
["I1","BitIn"],
["I2","BitIn"],
["O","Bit"]
]],
"instances":{
"orr_inst0":{
"genref":"coreir.orr",
"genargs":{"width":["Int",3]}
}
},
"connections":[
["self.I0","orr_inst0.in.0"],
["self.I1","orr_inst0.in.1"],
["self.I2","orr_inst0.in.2"],
["self.O","orr_inst0.out"]
]
},
"fold_xor3None":{
"type":["Record",[
["I0","BitIn"],
["I1","BitIn"],
["I2","BitIn"],
["O","Bit"]
]],
"instances":{
"xor_inst0":{
"modref":"corebit.xor"
},
"xor_inst1":{
"modref":"corebit.xor"
}
},
"connections":[
["xor_inst0.in0","self.I0"],
["xor_inst0.in1","self.I1"],
["xor_inst1.in1","self.I2"],
["xor_inst1.out","self.O"],
["xor_inst1.in0","xor_inst0.out"]
]
}
}
}
}
}
In [4]:
from fault.test_vectors import generate_simulator_test_vectors
import fault
tests = generate_simulator_test_vectors(Adder4, flatten=False)
print(" a b ci o co")
for test in tests:
for t in test:
print("{:2d}".format(int(t)), end=' ')
print()
a b ci o co
0 0 0 0 0
0 0 1 1 0
0 1 0 1 0
0 1 1 2 0
0 2 0 2 0
0 2 1 3 0
0 3 0 3 0
0 3 1 4 0
0 4 0 4 0
0 4 1 5 0
0 5 0 5 0
0 5 1 6 0
0 6 0 6 0
0 6 1 7 0
0 7 0 7 0
0 7 1 8 0
0 8 0 8 0
0 8 1 9 0
0 9 0 9 0
0 9 1 10 0
0 10 0 10 0
0 10 1 11 0
0 11 0 11 0
0 11 1 12 0
0 12 0 12 0
0 12 1 13 0
0 13 0 13 0
0 13 1 14 0
0 14 0 14 0
0 14 1 15 0
0 15 0 15 0
0 15 1 0 1
1 0 0 1 0
1 0 1 2 0
1 1 0 2 0
1 1 1 3 0
1 2 0 3 0
1 2 1 4 0
1 3 0 4 0
1 3 1 5 0
1 4 0 5 0
1 4 1 6 0
1 5 0 6 0
1 5 1 7 0
1 6 0 7 0
1 6 1 8 0
1 7 0 8 0
1 7 1 9 0
1 8 0 9 0
1 8 1 10 0
1 9 0 10 0
1 9 1 11 0
1 10 0 11 0
1 10 1 12 0
1 11 0 12 0
1 11 1 13 0
1 12 0 13 0
1 12 1 14 0
1 13 0 14 0
1 13 1 15 0
1 14 0 15 0
1 14 1 0 1
1 15 0 0 1
1 15 1 1 1
2 0 0 2 0
2 0 1 3 0
2 1 0 3 0
2 1 1 4 0
2 2 0 4 0
2 2 1 5 0
2 3 0 5 0
2 3 1 6 0
2 4 0 6 0
2 4 1 7 0
2 5 0 7 0
2 5 1 8 0
2 6 0 8 0
2 6 1 9 0
2 7 0 9 0
2 7 1 10 0
2 8 0 10 0
2 8 1 11 0
2 9 0 11 0
2 9 1 12 0
2 10 0 12 0
2 10 1 13 0
2 11 0 13 0
2 11 1 14 0
2 12 0 14 0
2 12 1 15 0
2 13 0 15 0
2 13 1 0 1
2 14 0 0 1
2 14 1 1 1
2 15 0 1 1
2 15 1 2 1
3 0 0 3 0
3 0 1 4 0
3 1 0 4 0
3 1 1 5 0
3 2 0 5 0
3 2 1 6 0
3 3 0 6 0
3 3 1 7 0
3 4 0 7 0
3 4 1 8 0
3 5 0 8 0
3 5 1 9 0
3 6 0 9 0
3 6 1 10 0
3 7 0 10 0
3 7 1 11 0
3 8 0 11 0
3 8 1 12 0
3 9 0 12 0
3 9 1 13 0
3 10 0 13 0
3 10 1 14 0
3 11 0 14 0
3 11 1 15 0
3 12 0 15 0
3 12 1 0 1
3 13 0 0 1
3 13 1 1 1
3 14 0 1 1
3 14 1 2 1
3 15 0 2 1
3 15 1 3 1
4 0 0 4 0
4 0 1 5 0
4 1 0 5 0
4 1 1 6 0
4 2 0 6 0
4 2 1 7 0
4 3 0 7 0
4 3 1 8 0
4 4 0 8 0
4 4 1 9 0
4 5 0 9 0
4 5 1 10 0
4 6 0 10 0
4 6 1 11 0
4 7 0 11 0
4 7 1 12 0
4 8 0 12 0
4 8 1 13 0
4 9 0 13 0
4 9 1 14 0
4 10 0 14 0
4 10 1 15 0
4 11 0 15 0
4 11 1 0 1
4 12 0 0 1
4 12 1 1 1
4 13 0 1 1
4 13 1 2 1
4 14 0 2 1
4 14 1 3 1
4 15 0 3 1
4 15 1 4 1
5 0 0 5 0
5 0 1 6 0
5 1 0 6 0
5 1 1 7 0
5 2 0 7 0
5 2 1 8 0
5 3 0 8 0
5 3 1 9 0
5 4 0 9 0
5 4 1 10 0
5 5 0 10 0
5 5 1 11 0
5 6 0 11 0
5 6 1 12 0
5 7 0 12 0
5 7 1 13 0
5 8 0 13 0
5 8 1 14 0
5 9 0 14 0
5 9 1 15 0
5 10 0 15 0
5 10 1 0 1
5 11 0 0 1
5 11 1 1 1
5 12 0 1 1
5 12 1 2 1
5 13 0 2 1
5 13 1 3 1
5 14 0 3 1
5 14 1 4 1
5 15 0 4 1
5 15 1 5 1
6 0 0 6 0
6 0 1 7 0
6 1 0 7 0
6 1 1 8 0
6 2 0 8 0
6 2 1 9 0
6 3 0 9 0
6 3 1 10 0
6 4 0 10 0
6 4 1 11 0
6 5 0 11 0
6 5 1 12 0
6 6 0 12 0
6 6 1 13 0
6 7 0 13 0
6 7 1 14 0
6 8 0 14 0
6 8 1 15 0
6 9 0 15 0
6 9 1 0 1
6 10 0 0 1
6 10 1 1 1
6 11 0 1 1
6 11 1 2 1
6 12 0 2 1
6 12 1 3 1
6 13 0 3 1
6 13 1 4 1
6 14 0 4 1
6 14 1 5 1
6 15 0 5 1
6 15 1 6 1
7 0 0 7 0
7 0 1 8 0
7 1 0 8 0
7 1 1 9 0
7 2 0 9 0
7 2 1 10 0
7 3 0 10 0
7 3 1 11 0
7 4 0 11 0
7 4 1 12 0
7 5 0 12 0
7 5 1 13 0
7 6 0 13 0
7 6 1 14 0
7 7 0 14 0
7 7 1 15 0
7 8 0 15 0
7 8 1 0 1
7 9 0 0 1
7 9 1 1 1
7 10 0 1 1
7 10 1 2 1
7 11 0 2 1
7 11 1 3 1
7 12 0 3 1
7 12 1 4 1
7 13 0 4 1
7 13 1 5 1
7 14 0 5 1
7 14 1 6 1
7 15 0 6 1
7 15 1 7 1
8 0 0 8 0
8 0 1 9 0
8 1 0 9 0
8 1 1 10 0
8 2 0 10 0
8 2 1 11 0
8 3 0 11 0
8 3 1 12 0
8 4 0 12 0
8 4 1 13 0
8 5 0 13 0
8 5 1 14 0
8 6 0 14 0
8 6 1 15 0
8 7 0 15 0
8 7 1 0 1
8 8 0 0 1
8 8 1 1 1
8 9 0 1 1
8 9 1 2 1
8 10 0 2 1
8 10 1 3 1
8 11 0 3 1
8 11 1 4 1
8 12 0 4 1
8 12 1 5 1
8 13 0 5 1
8 13 1 6 1
8 14 0 6 1
8 14 1 7 1
8 15 0 7 1
8 15 1 8 1
9 0 0 9 0
9 0 1 10 0
9 1 0 10 0
9 1 1 11 0
9 2 0 11 0
9 2 1 12 0
9 3 0 12 0
9 3 1 13 0
9 4 0 13 0
9 4 1 14 0
9 5 0 14 0
Content source: phanrahan/magmathon
Similar notebooks: