--- nand.py- +++ nand.py @@ -42,26 +42,6 @@ elif self.parent and hasattr(self.parent, 'update'): self.enque(self.parent.update) -class Foo(Obj): - def __init__(self, parent, latency=None): - Obj.__init__(self, parent, 'foo', latency) - self.v = 0 - - Pin(self, 'inp') - Pin(self, 'out') - - self.enque( self.add, (0, ) ) - - def add(self, a): - self.v += a - self.dbgout( 'v={}'.format(self.v) ) - if self.v < 55: - self.enque( self.add, (a+1,) ) - - def update(self): - v = not self.inp.v - self.enque( self.out.set, (v,) ) - class NAND(Obj): def __init__(self, parent, name='nand', latency=10): Obj.__init__(self, parent, name, latency) @@ -98,8 +78,10 @@ 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 + Joint(self, 'jt') + Pin(self, 'inp').conn = self.jt.new_pin() + self.jt.new_pin().conn = self.nand.inp_a + self.jt.new_pin().conn = self.nand.inp_b self.nand.out.conn = Pin(self, 'out') class AND(Obj): @@ -161,6 +143,20 @@ self.nand_b.out.conn = self.nand_o.inp_b self.nand_o.out.conn = Pin(self, 'out') +class CLK(Obj): + def __init__(self, parent, hz=1.0, name='clk'): + Obj.__init__(self, parent, name) + latency = tm_from_fsec( 1.0 / ( 2 * hz ) ) + NAND(self, 'nand', latency) + Joint(self) + NOT(self) + + Pin(self, 'en', 'L').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.not_.out.conn = Pin(self, 'out') + class Lamp(Obj): def __init__(self, parent, name='lamp', latency=None): Obj.__init__(self, parent, name, latency) @@ -197,12 +193,15 @@ def main_loop(self): self.run = True + start = time.time() 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 + if '-f' not in sys.argv: + tm_sleep(tm, start) f(*args) else: time.sleep(0.5) @@ -234,7 +233,6 @@ return n1 > n2 if s1 == s2 else s1 > s2 def tm_add( (s1,n1), (s2,n2) ): - giga = 1000000000 n1 += n2 s1 += s2 + n1 / giga n1 %= giga @@ -243,11 +241,26 @@ def tm_str( (s,n) ): return '{}.{:0>9}'.format(s, n) +def tm_sleep( tm, start_fsec ): + wait = start_fsec + tm_fsec(tm) - time.time() + if wait > 0: + time.sleep(wait) + +def tm_fsec( (s, n) ): + return s + float(n) / giga + +def tm_from_fsec(fsec): + s = int(fsec) + n = int( (fsec - s) * giga ) + return (s, n) + def dbgout(s, always=False): if always or '-v' in sys.argv: print '{} {}'.format( tm_str(sched.now), s ) sys.stdout.flush() +giga = 1000000000 + if __name__ == "__main__": sched = Sched()