--- nand.py- +++ nand.py @@ -94,6 +94,73 @@ if pin.conn: pin.set(v) +class NOT(Obj): + def __init__(self, parent, name='not_', latency=10): + Obj.__init__(self, parent, name) + NAND(self, 'nand', latency) + Pin(self, 'inp').conn = self.nand.inp_a + Pin(self, 'H', 'H').conn = self.nand.inp_b + self.nand.out.conn = Pin(self, 'out') + +class AND(Obj): + def __init__(self, parent, name='and_', latency=10): + Obj.__init__(self, parent, name) + NAND(self, 'nand', latency) + Pin(self, 'inp_a').conn = self.nand.inp_a + Pin(self, 'inp_b').conn = self.nand.inp_b + NOT(self, 'not_', latency) + self.nand.out.conn = self.not_.inp + self.not_.out.conn = Pin(self, 'out') + +class OR(Obj): + def __init__(self, parent, name='or_', latency=10): + Obj.__init__(self, parent, name) + NOT(self, 'not_a', latency) + Pin(self, 'inp_a').conn = self.not_a.inp + NOT(self, 'not_b', latency) + Pin(self, 'inp_b').conn = self.not_b.inp + NAND(self, 'nand', latency) + self.not_a.out.conn = self.nand.inp_a + self.not_b.out.conn = self.nand.inp_b + self.nand.out.conn = Pin(self, 'out') + +class NOR(Obj): + def __init__(self, parent, name='nor', latency=10): + Obj.__init__(self, parent, name) + OR(self, 'or_', latency) + Pin(self, 'inp_a').conn = self.or_.inp_a + Pin(self, 'inp_b').conn = self.or_.inp_b + NOT(self, 'not_', latency) + self.or_.out.conn = self.not_.inp + self.not_.out.conn = Pin(self, 'out') + +class XOR(Obj): + def __init__(self, parent, name='xor', latency=10): + Obj.__init__(self, parent, name) + NAND(self, 'nand_i', latency) + NAND(self, 'nand_a', latency) + NAND(self, 'nand_b', latency) + NAND(self, 'nand_o', latency) + Joint(self, 'jt_a') + Joint(self, 'jt_b') + Joint(self, 'jt_c') + + Pin(self, 'inp_a').conn = self.jt_a.new_pin() + self.jt_a.new_pin().conn = self.nand_i.inp_a + self.jt_a.new_pin().conn = self.nand_a.inp_a + + Pin(self, 'inp_b').conn = self.jt_b.new_pin() + self.jt_b.new_pin().conn = self.nand_i.inp_b + self.jt_b.new_pin().conn = self.nand_b.inp_b + + self.nand_i.out.conn = self.jt_c.new_pin() + self.jt_c.new_pin().conn = self.nand_a.inp_b + self.jt_c.new_pin().conn = self.nand_b.inp_a + + self.nand_a.out.conn = self.nand_o.inp_a + self.nand_b.out.conn = self.nand_o.inp_b + self.nand_o.out.conn = Pin(self, 'out') + class Lamp(Obj): def __init__(self, parent, name='lamp', latency=None): Obj.__init__(self, parent, name, latency) @@ -133,6 +200,7 @@ while self.run: cmd_exec( sys.stdin ) if self.que: + #dbgout( 'que={}'.format(self.que) ) (tm, f, args) = self.que.pop(0) self.now = tm f(*args)