def generate_test(Circuit, func): #nfuncargs = check(circuit, func) sig = signature(func) nfuncargs = len(sig.parameters) assert nfuncargs + 1 < 8 rom = testvectors(func) romb = ROMB(rom) counter = Counter(9) wire(1, romb.RE) wire(1, romb.RCLKE) wire(counter.O, romb.RADDR) circuit = Circuit(nfuncargs) circuit(*[romb.RDATA[i] for i in range(nfuncargs)]) orr = Or(2) finished = DFF() f = finished(orr(counter.COUT, finished.O)) xor = XOr(2) xor(circuit.O, romb.RDATA[nfuncargs]) orr = Or(2) error = DFF() e = error(orr(xor.O, error.O)) return f, e
def makepico(prog, inputs, outputs, ADDRN, DATAN): mem = assemble(prog, 1 << ADDRN) romb = ROMB(mem) # this should have a width=16 #print(repr(romb)) #print('ADDRN',len(romb.RADDR)) #print('INSTN',len(romb.RDATA)) assert len(romb.RDATA) == 16 wire( 1, romb.RE) pico = Pico(ADDRN, DATAN) #print('ADDRN',len(pico.addr)) #print('INSTN',len(pico.data)) wire(pico.addr, romb.RADDR) wire(romb.RDATA, pico.data) input = Input(DATAN, inputs) wire(pico.port, input.A) wire(input.O, pico.I) output = Output(DATAN, outputs) wire(pico.port, output.A) wire(pico.we, output.WE) wire(pico.O, output.I) return pico, romb
def makepico(prog, input, output, ADDRN, DATAN, debug): mem = assemble(prog, 1 << ADDRN) romb = ROMB(len(mem), 16, mem) # this should have a width=16 #print(repr(romb)) #print('ADDRN',len(romb.RADDR)) #print('INSTN',len(romb.RDATA)) assert len(romb.RDATA) == 16 wire(1, romb.RE) pico = Pico(ADDRN, DATAN, debug) #print('ADDRN',len(pico.addr)) #print('INSTN',len(pico.data)) wire(pico.addr, romb.RADDR) wire(romb.RDATA, pico.data) #input = Input(DATAN, inputs) #wire(pico.port, input.A) #wire(input.O, pico.I) wire(input, pico.I) if debug is None: #output = Output(DATAN, outputs) #wire(pico.port, output.A) reg = Register(DATAN, has_ce=True) reg(pico.O, ce=pico.we) wire(reg.O, output) else: wire(pico.O, output) return pico, romb
def definition(io): weigths_rom = ROMB(weights_list) # using 16 LUTs to store the image, each LUT contributes 1 bit per cycle lut_list = [] for i in range(N): lut_list.append(SB_LUT4(LUT_INIT=imgs_list[N * image_id + i])) wire(io.CYCLE, weigths_rom.RADDR[:n]) wire(io.IDX, weigths_rom.RADDR[n:n + b]) if n+b < 8: wire(bits(0, 8-n-b), weigths_rom.RADDR[n+b:]) wire(1, weigths_rom.RE) wire(weigths_rom.RDATA, io.WEIGHT) wire(io.CLK, weigths_rom.RCLK) for i in range(N): wire(io.CYCLE, bits([lut_list[i].I0, lut_list[i].I1, lut_list[i].I2, lut_list[i].I3])) wire(lut_list[i].O, io.IMAGE[i])
def definition(io): weights_list = [1] + [2**16-1]*15 + [3] + [2**16-1]*15 + ([0] + [2**16-1]*15)*((256-32)//16) weigths_rom = ROMB(weights_list) lut_list = [] for i in range(N): lut_list.append(SB_LUT4(LUT_INIT=1)) wire(io.CYCLE, weigths_rom.RADDR[:n]) wire(io.IDX, weigths_rom.RADDR[n:n+b]) if n + b < 8: wire(bits(0, 8-n-b), weigths_rom.RADDR[n+b:]) wire(1, weigths_rom.RE) wire(weigths_rom.RDATA, io.WEIGHT) wire(io.CLK, weigths_rom.RCLK) for i in range(N): wire(io.CYCLE, bits([lut_list[i].I0, lut_list[i].I1, lut_list[i].I2, lut_list[i].I3])) wire(lut_list[i].O, io.IMAGE[i])
def definition(io): # save the weights to memory (ROM) weights_rom = ROMB(len(weights_list), 16, weights_list) wire(io.CYCLE, weights_rom.RADDR[:n]) wire(io.IDX, weights_rom.RADDR[n:n + b]) if n + b < 8: wire(bits(0, 8 - n - b), weights_rom.RADDR[n + b:]) wire(1, weights_rom.RE) wire(weights_rom.RDATA, io.WEIGHT) wire(io.CLK, weights_rom.RCLK) # save the image to RAM, 16 bits at a time image_ram = mantle.RAM(4, 16) wire(io.WE, image_ram.WE) wire(io.CLK, image_ram.CLK) wire(io.CYCLE, image_ram.RADDR) wire(io.WADDR, image_ram.WADDR) wire(io.DATA, image_ram.WDATA) wire(image_ram.RDATA, io.IMAGE)
for i in range(7): nop() jmp(0) mem = assemble(prog, 1 << ADDRN) icestick = IceStick() icestick.Clock.on() for i in range(DATAN): icestick.J3[i].output().on() main = icestick.main() # program memory romb = ROMB(len(mem), 16, mem) wire(1, romb.RE) inst = romb.RDATA addr = inst[0:ADDRN] jump = inst[15] # 2 phases: read inst, execute inst tff = TFF() tff(1) seq = Sequencer(DATAN) pc = seq(addr, jump, tff) wire(pc, romb.RADDR)