5 # 3-trit Computer Simulator
6 # usage: logicCpu program.3
7 # This program simulates the hardware of the 3 trit computer we are
8 # developing. Input to the program is a ".3" file which should contain
9 # three encoded instructions to simulate on the first line. Once started,
10 # the user may interactively change the "IN" register at any time.
11 # Execution begins with instruction at program counter 0.
13 import sys
, os
, threading
, time
17 USER_INPUT_THREAD
= True # ask for user input?
18 USER_INPUT_INIT
= 8 # initialize input to this
20 trit_integer
= {"i": -1, "0":0, "1":1}
22 # Lookup a register's name by address
37 # Thread that gets input from user
38 class CPUInput (threading
.Thread
):
41 print "Register Status: %s :" % registers
,
42 user_input
= raw_input('Input value for IN:')
45 digit
= int(user_input
)
47 print "invalid input: %s (%s)" % (user_input
, e
)
50 if digit
>= -4 and digit
<= 4:
51 registers
["IN"] = digit
53 print """invalid input: %s""" % user_input
57 if len(sys
.argv
) < 2 or len(sys
.argv
) > 2:
58 print """usage: %s program.3
59 input file: program.3 - machine code
63 if (sys
.argv
[1])[len(sys
.argv
[1])-1:] != "3":
64 print """\'%s\' is an invalid filetype""" % sys
.argv
[1]
68 codefile
= file(sys
.argv
[1], "rt")
69 tritstream
= codefile
.readline()
71 # check for errors in file
73 print """\'%s\' files is empty""" % (sys
.argv
[1])
77 if not i
in trit_integer
:
78 print """invalid char \'%s\' in file \'%s\'""" % (i
, sys
.argv
[1])
81 if len(tritstream
) != 9:
82 print """3 instructions must be provided in \'%s\'""" % (sys
.argv
[1])
85 # memory, registers, and program counter
89 # decode instructions from file
90 for i
in range(-1, 2):
92 memory
[i
] = Decoder(tritstream
)
93 tritstream
= tritstream
[3:]
95 # start user input thread
98 registers
["IN"] = USER_INPUT_INIT
100 # execute instructions
102 registers
["PC"] = Execute(memory
)
109 def Decoder(tritstream
):
110 """ Decode a single instruction.
111 tristream: stream of trits will only process the first 3 trits.
112 return: dictionary containing the operation
114 inst
= {"op":trit_integer
[tritstream
[0]]}
117 if inst
["op"] == -1 or inst
["op"] == 1:
124 inst
["src1"] = trit_integer
[tritstream
[1]]
125 print "%2d," % inst
["src1"],
126 inst
["src2"] = trit_integer
[tritstream
[2]]
127 print "%2d" % inst
["src2"]
130 elif inst
["op"] == 0:
132 inst
["src1"] = trit_integer
[tritstream
[1]]
133 inst
["src2"] = trit_integer
[tritstream
[2]]
134 inst
["immed"] = 3*inst
["src1"] + inst
["src2"]
135 print "%2d" % inst
["immed"]
140 """ Execute one instruction.
141 memory: were decoded instructions are stored
142 registers: contains registers and their values
143 returns: new program counter, to be stored in registers["PC"]
146 op
= (memory
[registers
["PC"]])["op"]
150 src1
= (memory
[registers
["PC"]])["src1"]
151 src2
= (memory
[registers
["PC"]])["src2"]
152 if registers
[register_name
[src1
]] < registers
[register_name
[src2
]]:
154 elif registers
[register_name
[src1
]] > registers
[register_name
[src2
]]:
158 new_pc
= registers
["PC"] + 1
161 registers
["A"] = (memory
[registers
["PC"]])["immed"]
162 new_pc
= registers
["PC"] + 1
165 if registers
["S"] == 0:
166 new_pc
= (memory
[registers
["PC"]])["src1"]
168 new_pc
= (memory
[registers
["PC"]])["src2"]
175 if __name__
== "__main__":