--- nand.py- +++ nand.py @@ -84,7 +84,10 @@ v = reduce(f, ivs, None) for pin in self.pins: if pin.conn: - pin.set(v) + if self.latency: + self.enque(pin.set, v) + else: + pin.set(v) def new_pin_conn_n(self, n, targ, name, sta_i): for i in range(n): @@ -112,6 +115,14 @@ else: targ_pin.conn = jt.new_pin() +class BUF(Obj): + # inp, out + def __init__(self, parent, name='buf', latency=10): + # for timing + Obj.__init__(self, parent, name) + Pin(self, 'inp').conn = Joint(self, 'jt', latency).new_pin() + self.jt.new_pin().conn = Pin(self, 'out') + class NOT(Obj): # inp, out def __init__(self, parent, name='not_', latency=10): @@ -268,6 +279,16 @@ self.or_n.out.conn = self.not_.inp self.not_.out.conn = Pin(self, 'out') +class PosiNega(Obj): + # inp, Q, nQ + def __init__(self, parent, name='posi_nega', latency=10): + Obj.__init__(self, parent, name) + Pin(self, 'inp').conn = Joint(self, 'jt').new_pin() + BUF(self, 'buf', latency).out.conn = Pin(self, 'Q') + NOT(self, 'not_', latency).out.conn = Pin(self, 'nQ') + self.jt.new_pin().conn = self.buf.inp + self.jt.new_pin().conn = self.not_.inp + class RSFF(Obj): # R, S, Q, nQ def __init__(self, parent, name='rsff', latency=10): @@ -298,6 +319,8 @@ RSFF(self, 'rsff_k', latency) NAND(self, 'nand_j', latency) NAND(self, 'nand_k', latency) + BUF(self, 'buf_j', latency) + BUF(self, 'buf_k', latency) AND(self, 'and_j', latency) AND(self, 'and_k', latency) Joint(self, 'jt_clk') @@ -313,10 +336,12 @@ Pin(self, 'J', 'L').conn = self.nand_j.inp_b Pin(self, 'K', 'L').conn = self.nand_k.inp_a - self.nand_j.out.conn = self.rsff_j.R + self.nand_j.out.conn = self.buf_j.inp + self.buf_j.out.conn = self.rsff_j.R self.and_j.out.conn = self.rsff_j.S self.and_k.out.conn = self.rsff_k.R - self.nand_k.out.conn = self.rsff_k.S + self.nand_k.out.conn = self.buf_k.inp + self.buf_k.out.conn = self.rsff_k.S self.rsff_j.nQ.conn = self.jt_j_i.new_pin() self.jt_j_i.new_pin().conn = self.rsff_o.R @@ -350,10 +375,9 @@ Obj.__init__(self, parent, name) JKFF(self, 'jkff', latency) Pin(self, 'CLK', 'L').conn = self.jkff.CLK - Pin(self, 'D', 'L').conn = Joint(self, 'jt').new_pin() - self.jt.new_pin().conn = self.jkff.J - self.jt.new_pin().conn = NOT(self, 'not_', latency).inp - self.not_.out.conn = self.jkff.K + Pin(self, 'D', 'L').conn = PosiNega(self, 'posi_nega', latency).inp + self.posi_nega.Q.conn = self.jkff.J + self.posi_nega.nQ.conn = self.jkff.K self.jkff.Q.conn = Pin(self, 'Q') self.jkff.nQ.conn = Pin(self, 'nQ') @@ -688,18 +712,18 @@ late = tm_from_fsec( 1.0 / ( 2 * hz ) ) NAND(self, 'nand', late) Joint(self) - NOT(self, 'not_', latency) + PosiNega(self, 'posi_nega', latency) Pin(self, 'en', 'L').conn = Joint(self, 'jt_en').new_pin() self.jt_en.new_pin().conn = self.nand.inp_a self.nand.out.conn = self.jt.new_pin() self.jt.new_pin().conn = self.nand.inp_b - self.jt.new_pin().conn = self.not_.inp + self.jt.new_pin().conn = self.posi_nega.inp GATE(self, 2, 'gate', latency) self.jt_en.new_pin().conn = self.gate.en - self.jt.new_pin().conn = self.gate.inp_0 - self.not_.out.conn = self.gate.inp_1 + self.posi_nega.Q.conn = self.gate.inp_0 + self.posi_nega.nQ.conn = self.gate.inp_1 self.gate.out_1.conn = Pin(self, 'nQ') self.gate.out_0.conn = Joint(self, 'jt_out').new_pin()