--- nand.py- +++ nand.py @@ -22,16 +22,12 @@ sched.enque(self.latency, f, args) class Pin(Obj): - def __init__(self, parent, name, direc='IO', v=None): + def __init__(self, parent, name, v=None): Obj.__init__(self, parent, name) - self.direc = direc - self.v = v + self.v = None self.conn = None - - def connect(self, other): - self.conn = other - if other and other.conn != self: - other.conn = self + if v != None: + self.enque( self.set, (v,) ) def set(self, v): v = bool_v(v) @@ -39,21 +35,18 @@ return self.v = v self.dbgout( str_v(v) ) - if self.has('O') and self.conn: + if self.conn: self.conn.set(v) - if self.has('I') and self.parent and hasattr(self.parent, 'update'): + elif self.parent and hasattr(self.parent, 'update'): self.enque(self.parent.update) - def has(self, direc): # direc 'I' or 'O' - return direc in self.direc - class Foo(Obj): def __init__(self, parent, latency=None): Obj.__init__(self, parent, 'foo', latency) self.v = 0 - Pin(self, 'inp', 'I') - Pin(self, 'out', 'O') + Pin(self, 'inp') + Pin(self, 'out') self.enque( self.add, (0, ) ) @@ -70,9 +63,9 @@ class NAND(Obj): def __init__(self, parent, name='nand', latency=10): Obj.__init__(self, parent, name, latency) - Pin(self, 'out', 'O') - Pin(self, 'inp_a', 'I') - Pin(self, 'inp_b', 'I') + Pin(self, 'out') + Pin(self, 'inp_a') + Pin(self, 'inp_b') def update(self): self.dbgout('update') @@ -84,30 +77,25 @@ Obj.__init__(self, parent, name, latency) self.pins = [] - def connect(self, other_pin): - direc = { 'I': 'O', 'O': 'I' }.get(other_pin.direc, 'IO') - pin = self.new_pin(direc) - pin.connect(other_pin) - - def new_pin(self, direc='IO'): + def new_pin(self): i = len(self.pins) - name = 'pin{}_{}'.format(i, direc) - pin = Pin(self, name, direc) + name = 'pin{}'.format(i) + pin = Pin(self, name) self.pins.append(pin) return pin def update(self): - ivs = [ pin.v for pin in self.pins if pin.has('I') ] + ivs = [ pin.v for pin in self.pins if not pin.conn ] f = lambda r, v: r if v == None else ( v if r == None else r or v ) # OR v = reduce(f, ivs, None) for pin in self.pins: - if pin.has('O'): + if pin.conn: pin.set(v) class Lamp(Obj): def __init__(self, parent, name='lamp', latency=None): Obj.__init__(self, parent, name, latency) - Pin(self, 'inp', 'I') + Pin(self, 'inp') def update(self): msg = str_v( self.inp.v ) @@ -183,8 +171,8 @@ slow_12 = Obj(o, 'slow_12') Foo(slow_12, 12) - o.foo.out.connect( o.slow.foo.inp ) - o.slow.foo.out.connect( o.slow_12.foo.inp ) + o.foo.out.conn = o.slow.foo.inp + o.slow.foo.out.conn = o.slow_12.foo.inp sched.enque( 200, o.foo.out.set, ('H',) ) NAND(o) @@ -198,13 +186,13 @@ NAND(test1) Joint(test1) Lamp(test1) - o.test1.jt.connect( o.test1.nand.out ) - o.test1.jt.connect( o.test1.nand.inp_a ) - o.test1.jt.new_pin('O').connect( o.test1.lamp.inp ) + o.test1.nand.out.conn = o.test1.jt.new_pin() + o.test1.jt.new_pin().conn = o.test1.nand.inp_a + o.test1.jt.new_pin().conn = o.test1.lamp.inp + sched.enque( 400, o.test1.nand.inp_b.set, ('H',) ) sched.enque( 500, o.test1.nand.inp_b.set, ('L',) ) - - sched.enque( (2,0), o.test1.lamp.inp.set, ('L',) ) + sched.enque( (3,0), o.test1.lamp.inp.set, ('L',) ) sched.main_loop()