我真的有醋啊

# -*- 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)
posted @ 2021-11-24 22:46  Fun_with_Words  阅读(40)  评论(0编辑  收藏  举报









 张牌。