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