我真的有醋啊
# -*- coding: utf-8 -*- from functools import reduce class ROM: # Read Only Memory def __init__(m): m.bytes = ( (0, 0, 0, 0, 0, 0, 0, 1), # store a 1 (0, 0, 1, 0, 0, 0, 1, 0), # store b 2 (0, 1, 0, 0, 0, 0, 0, 1), # add a 1 (0, 1, 1, 1, 1, 1, 1, 1), # add b -1 (1, 0, 0, 0, 0, 0, 1, 0), # jlz 2 (1, 1, 0, 1, 1, 1, 0, 1), # jmp -3 (1, 1, 0, 0, 0, 0, 0, 0), # jmp 0 ) m.a7 = m.a6 = m.a5 = m.a4 = m.a3 = m.a2 = m.a1 = m.a0 = 0 m.d7 = m.d6 = m.d5 = m.d4 = m.d3 = m.d2 = m.d1 = m.d0 = 0 def read(m): addr = reduce(lambda hi, low: hi * 2 + low, (m.a7, m.a6, m.a5, m.a4, m.a3, m.a2, m.a1, m.a0), 0) (m.d7, m.d6, m.d5, m.d4, m.d3, m.d2, m.d1, m.d0) = m.bytes[addr] class Adder85: def __init__(m): m.a7 = m.a6 = m.a5 = m.a4 = m.a3 = m.a2 = m.a1 = m.a0 = 0 m.b7 = m.b6 = m.b5 = m.b4 = m.b3 = m.b2 = m.b1 = m.b0 = 0 m.s7 = m.s6 = m.s5 = m.s4 = m.s3 = m.s2 = m.s1 = m.s0 = 0 def act(m): def add1(a, b): nonlocal carry s = a + b + carry carry = 1 if s >= 2 else 0 return s & 1 carry = 0 a = (m.a7, m.a6, m.a5, m.a4, m.a3, m.a2, m.a1, m.a0) b_ = (m.b0, m.b1, m.b2, m.b3, m.b4, m.b5, m.b6, m.b7) (m.s7, m.s6, m.s5, m.s4, m.s3, m.s2, m.s1, m.s0) = tuple(reversed(tuple(map(add1, a[::-1], b_)))) (m.s7, m.s6, m.s5) = (0, 0, 0) def zeros(n): return list(map(lambda x:0,tuple(range(n)))) m = ROM() r = [zeros(8), zeros(8)] p = zeros(8) a = Adder85() s = 0 def add_to_pc(x): global p (a.a7, a.a6, a.a5, a.a4, a.a3, a.a2, a.a1, a.a0) = p (a.b7, a.b6, a.b5, a.b4, a.b3, a.b2, a.b1, a.b0) = x a.act() p = (a.s7, a.s6, a.s5, a.s4, a.s3, a.s2, a.s1, a.s0) def inc_pc(): add_to_pc((0, 0, 0, 0, 0, 0, 0, 1)) while True: (m.a7, m.a6, m.a5, m.a4, m.a3, m.a2, m.a1, m.a0) = p m.read() i = (m.d7, m.d6, m.d5, m.d4, m.d3, m.d2, m.d1, m.d0) print(i) if i[:2] == (0, 0): r[i[2]] = (0, 0, 0) + i[3:] inc_pc() elif i[:2] == (0, 1): (a.a7, a.a6, a.a5, a.a4, a.a3, a.a2, a.a1, a.a0) = r[i[2]] (a.b7, a.b6, a.b5, a.b4, a.b3, a.b2, a.b1, a.b0) = (0, 0, 0) + i[3:] a.act() r[i[2]] = (a.s7, a.s6, a.s5, a.s4, a.s3, a.s2, a.s1, a.s0) s = a.s4 inc_pc() elif i[:2] == (1, 0): if s: add_to_pc((0, 0, 0) + i[3:]) else: inc_pc() elif i[:2] == (1, 1): if i[3:] == (0, 0, 0, 0, 0): break add_to_pc((0, 0, 0) + i[3:]) print('\t', r[0], r[1], p) #input('Press the Enter key')
# -*- coding: utf-8 -*- from functools import reduce def bits(n, b = 0): return list(map(lambda x:b,list(range(n)))) class ROM: def __init__(m): m.bytes = ( ( 0, 0, 0, 0, 0, 0, 0, 1 ), # store a 1 ( 0, 0, 1, 0, 0, 0, 1, 0 ), # store b 2 ( 0, 1, 0, 0, 0, 0, 0, 1 ), # add a 1 ( 0, 1, 1, 1, 1, 1, 1, 1 ), # add b -1 ( 1, 0, 0, 0, 0, 0, 1, 0 ), # jlz 2 ( 1, 1, 0, 1, 1, 1, 0, 1 ), # jmp -3 ( 1, 1, 0, 0, 0, 0, 0, 0 ), # jmp 0 ) m.a = m.d = bits(8) # They will have different id() after being assigned def read(m): m.d = m.bytes[reduce(lambda hi, low: hi * 2 + low, m.a, 0)] class Adder85: def __init__(m): m.a = m.b = m.s = bits(8) def act(m): def add1(a, b): nonlocal carry s = a + b + carry carry = 1 if s >= 2 else 0 return s & 1 carry = 0 m.s = list(map(add1, m.a[::-1], m.b[::-1]))[::-1] # (1,2)[::-1] = (2, 1) # LOOK OUT! # python: 0 1 2 3 4 5 6 7 # brain: 7 6 5 4 3 2 1 0 m.s[0:3] = [0, 0, 0] m = ROM(); r = [bits(8), bits(8)]; p = bits(8); a = Adder85(); s = 0 def add_up_pc(x): global p a.a = p; a.b = x a.act() p = a.s def inc_pc(): add_up_pc((0, 0, 0, 0, 0, 0, 0, 1)) while True: m.a = p; m.read(); i = m.d; print(i) if i[:2] == (0, 0): r[i[2]] = (0, 0, 0) + i[3:]; inc_pc() elif i[:2] == (0, 1): a.a = r[i[2]]; a.b = (0, 0, 0) + i[3:]; a.act() r[i[2]] = a.s; s = a.s[3]; inc_pc() elif i[:2] == (1, 0): if s: add_up_pc((0, 0, 0) + i[3:]) else: inc_pc() elif i[:2] == (1, 1): if i[3:] == (0, 0, 0, 0, 0): break add_up_pc((0, 0, 0) + i[3:]) print('\t', r[0], r[1], p)
1. Programmable Read Only Memory (PROM); 2. Programmable Array Logic (PAL); 3. Programmable Logic Array (PLA) 也许2,3是用电把电线烧断,形成一个组合逻辑电路。面包板是人插线。1么,存真值表的想法可能absurd,但memory里存表格真的顺耳。内存很耗晶体管吧,An Wang was a Chinese-American computer engineer and inventor, who did formidable work in the field of magnetic core memory.
# -*- coding: utf-8 -*- from functools import reduce def bits(n, b = 0): return list(map(lambda x:b,list(range(n)))) class ROM: def __init__(m): m.bytes = ( ( 0, 0, 0, 0, 0, 0, 0, 1 ), # store a 1 ( 0, 0, 1, 0, 0, 0, 1, 0 ), # store b 2 ( 0, 1, 0, 0, 0, 0, 0, 1 ), # add a 1 ( 0, 1, 1, 1, 1, 1, 1, 1 ), # add b -1 ( 1, 0, 0, 0, 0, 0, 1, 0 ), # jlz 2 ( 1, 1, 0, 1, 1, 1, 0, 1 ), # jmp -3 ( 1, 1, 0, 0, 0, 0, 0, 0 ), # jmp 0 ) m.a = m.d = bits(8) # They will have different id() after being assigned def read(m): m.d = m.bytes[reduce(lambda hi, low: hi * 2 + low, m.a, 0)] class Adder: def __init__(m): m.a = m.b = m.s = bits(8) def add(m): def add1(a, b): nonlocal carry s = a + b + carry carry = 1 if s >= 2 else 0 return s & 1 carry = 0 m.s = list(map(add1, m.a[::-1], m.b[::-1]))[::-1] # (1,2)[::-1] = (2, 1) m.s[0:3] = [0, 0, 0] class Register: # w: write enable def __init__(m): m.d = m.w = m.q = bits(8) def write(m, x): m.d = x; m.w = bits(8, 1); m.q = x # FIX IT m = ROM() # LOOK OUT! r0 = r1 = Register() and then r0 = Register(), r0 and r1 are different. # Before that, they refer to the SAME object. r0 = Register(); r1 = Register(); p = Register() a = Adder(); s = 0 def add_up_pc(x): global p; a.a = p.q; a.b = x; a.add(); p.write(a.s) def inc_pc(): add_up_pc((0, 0, 0, 0, 0, 0, 0, 1)) # 0 can be hardcoded by not reset and ..., 1 by reset or ... pc is set, let's go while True: m.a = p.q; m.read(); i = m.d; print(i) if i[:2] == (0, 0): # Let r1.w = i[2], r0.w = not i[2] if i[2]: r1.write((0, 0, 0) + i[3:]) else: r0.write((0, 0, 0) + i[3:]) inc_pc() elif i[:2] == (0, 1): a.a = r1.q if i[2] else r0.q a.b = (0, 0, 0) + i[3:]; a.add(); s = a.s[3] if i[2]: r1.write(a.s) else: r0.write(a.s) inc_pc() elif i[:2] == (1, 0): if s: add_up_pc((0, 0, 0) + i[3:]) else: inc_pc() elif i[:2] == (1, 1): if i[3:] == (0, 0, 0, 0, 0): break add_up_pc((0, 0, 0) + i[3:]) print('\t', r0.q, r1.q, p.q)