--- nand.py- +++ nand.py @@ -388,6 +388,53 @@ new_pin_conn(self, self.dec_d, 0, n1, 'out', direc='from_in_obj') new_pin_conn(self, self.dec_u, n1, n1, 'out', direc='from_in_obj') +class ROM_D1(Obj): + def __init__(self, parent, abit_n, dlst=(), name='rom_d1', latency=10): + Obj.__init__(self, parent, name) + self.dbgout(dlst) + self.n = abit_n + for i in range(abit_n): + Pin( self, name_i('A', i), 'L' ) + n1 = abit_n - 1 + msb = getattr( self, name_i('A', n1) ) + msb.conn = DECODER(self, 1, 'deco', latency).inp_0 + + if abit_n == 1: + dlst_v = lambda i: dlst[i] if i < len(dlst) else -1 + dlst_b = lambda i: bool( dlst_v(i) & 1 ) + Pin(self, 'p0', dlst_b(0) ).conn = AND(self, 'and_d', latency).inp_a + Pin(self, 'p1', dlst_b(1) ).conn = AND(self, 'and_u', latency).inp_a + + en_d = self.and_d.inp_b + en_u = self.and_u.inp_b + out_d = self.and_d.out + out_u = self.and_u.out + else: + half = 1 << n1 + ROM_D1(self, n1, dlst[ :half ], 'rom_d', latency) + ROM_D1(self, n1, dlst[ half: ], 'rom_u', latency) + Joint_N(self, n1, 'jt_n') + self.jt_n.new_pin_conn(self.rom_d, 'A') + self.jt_n.new_pin_conn(self.rom_u, 'A') + self.jt_n.new_pin_conn(self, 'A', n1, direc='from_targ') + + en_d = self.rom_d.en + en_u = self.rom_u.en + out_d = self.rom_d.D_0 + out_u = self.rom_u.D_0 + + self.deco.out_0.conn = en_d + self.deco.out_1.conn = en_u + + OR(self, 'or_', latency).out.conn = AND(self, 'and_out', latency).inp_a + out_d.conn = self.or_.inp_a + out_u.conn = self.or_.inp_b + + Pin(self, 'en', 'L').conn = Joint(self, 'jt').new_pin() + self.jt.new_pin().conn = self.deco.en + self.jt.new_pin().conn = self.and_out.inp_b + self.and_out.out.conn = Pin(self, 'D_0', 'L') + class CLK(Obj): def __init__(self, parent, hz=1.0, name='clk', pos=(0,0), lamp_name=None): Obj.__init__(self, parent, name, None, pos)