# 5 = q
(
[
- (SYMBOL_TYPE_FET, (1, [0, 3])),
- (SYMBOL_TYPE_FET, (2, [3, 5])),
(SYMBOL_TYPE_GATE, (4, [[3]])),
(SYMBOL_TYPE_GATE, (5, [[4]])),
+ (SYMBOL_TYPE_FET, (1, [0, 3])),
+ (SYMBOL_TYPE_FET, (2, [3, 5])),
],
[
(SYMBOL_TYPE_TG_LATCH, (0, 1, 2, 5, 4)),
# special case of SYMBOL_TYPE_TG_LATCH where fb signal is external
(
[
- (SYMBOL_TYPE_FET, (1, [0, 3])),
- (SYMBOL_TYPE_FET, (2, [3, 5])),
(SYMBOL_TYPE_GATE, (4, [[3]])),
(SYMBOL_TYPE_GATE, (5, [[4]])),
+ (SYMBOL_TYPE_FET, (1, [0, 3])),
+ (SYMBOL_TYPE_FET, (2, [3, 5])),
],
[
(SYMBOL_TYPE_TG_LATCH_FB, (0, 1, 2, 5, 4, 3)),
),
]
-if len(sys.argv) < 3:
- print(f'usage: {sys.argv[0]:s} symbols.txt net_gnd,net_vcc')
+if len(sys.argv) < 4:
+ print(f'usage: {sys.argv[0]:s} gates.txt circuits.txt net_gnd,net_vcc')
sys.exit(1)
-symbols_txt = sys.argv[1]
-global_nets = sys.argv[2].split(',')
+gates_txt = sys.argv[1]
+circuits_txt = sys.argv[2]
+global_nets = sys.argv[3].split(',')
+print('input')
nets = {}
symbols = []
-with open(symbols_txt) as fin:
+with open(gates_txt) as fin:
line = fin.readline()
while len(line):
fields = line.split()
class Match(Exception):
pass
-for circuit_find, circuit_replace, circuit_internal in CIRCUITS:
+print('process')
+for i in range(len(CIRCUITS)):
+ print(i, '/', len(CIRCUITS))
+ circuit_find, circuit_replace, circuit_internal = CIRCUITS[i]
assert len(circuit_find)
circuit_symbols = [-1] * len(circuit_find)
circuit_nets = global_nets[::-1] + [None] * len(circuit_internal)
t = symbol_template[1] # template nets
assert isinstance(t, tuple)
- for i in range(len(symbols)):
- symbol_actual = symbols[i]
+ for j in range(len(symbols)):
+ symbol_actual = symbols[j]
at = symbol_actual[0] # actual type
a = symbol_actual[2] # actual nets
assert isinstance(a, tuple)
if tt == at and len(t) == len(a):
- #print('trying symbol', 0, i)
- circuit_symbols[0] = i
+ #print('trying symbol', 0, j)
+ circuit_symbols[0] = j
symbol_actual[0] = -1 # delete symbol during search
try:
match(1, (0, t, a, stack))
- #print('failed symbol', 0, i)
+ #print('failed symbol', 0, j)
symbol_actual[0] = at # reinstate symbol on backtrack
circuit_symbols[0] = -1 # not really necessary
except Match:
# add new symbols
for symbol_type, template in circuit_replace:
- symbols.append((symbol_type, block, substitute(template)))
+ symbols.append([symbol_type, block, substitute(template)])
# continue search
circuit_symbols = [-1] * len(circuit_find)
circuit_nets = global_nets[::-1] + [None] * len(circuit_internal)
-for i in range(len(symbols)):
- symbol_type = symbols[i][0]
- if symbol_type == SYMBOL_TYPE_FET:
- [
- _,
- block,
- (poly_net, diff_nets),
- channel,
- x,
- y,
- mass,
- r_matrix
- ] = symbols[i]
- print(symbol_type, block, poly_net, len(diff_nets), channel, x, y, mass)
- for i in range(len(diff_nets)):
- print(' ' + diff_nets[i], ' '.join([str(j) for j in r_matrix[i]]))
- elif symbol_type == SYMBOL_TYPE_GATE:
- [_, block, (y_net, expr)] = symbols[i]
- print(symbol_type, block, y_net, len(expr))
- for i in expr:
- print(' ' + ' '.join(i))
- elif symbol_type == SYMBOL_TYPE_XOR:
- [_, block, (y_net, a_nets)] = symbols[i]
- print(symbol_type, block, y_net, ' '.join(a_nets))
- elif symbol_type == SYMBOL_TYPE_TG_LATCH:
- [_, block, (d_net, le_net, len_net, q_net, qn_net)] = symbols[i]
- print(symbol_type, block, d_net, le_net, len_net, q_net, qn_net)
- elif symbol_type == SYMBOL_TYPE_TG_LATCH_FB:
- [_, block, (d_net, le_net, len_net, q_net, qn_net, fb_net)] = symbols[i]
- print(symbol_type, block, d_net, le_net, len_net, q_net, qn_net, fb_net)
- elif (
- symbol_type == SYMBOL_TYPE_SUPER or
- symbol_type == SYMBOL_TYPE_NOT_SUPER
- ):
- [_, block, (a_net, y_net)] = symbols[i]
- print(symbol_type, block, a_net, y_net)
- elif (
- symbol_type == SYMBOL_TYPE_SUPER_OE or
- symbol_type == SYMBOL_TYPE_NOT_SUPER_OE
- ):
- [_, block, (a_net, oen_net, y_net)] = symbols[i]
- print(symbol_type, block, a_net, oen_net, y_net)
- elif symbol_type == SYMBOL_TYPE_NOR_SUPER:
- [_, block, (a_net, b_net, y_net)] = symbols[i]
- print(symbol_type, block, a_net, b_net, y_net)
- elif symbol_type == SYMBOL_TYPE_NOR_SUPER_HD:
- [_, block, (a_net, b_net, y_net, hd_net)] = symbols[i]
- print(symbol_type, block, a_net, b_net, y_net, hd_net)
+print('output')
+with open(circuits_txt, 'w') as fout:
+ for i in range(len(symbols)):
+ symbol_type = symbols[i][0]
+ if symbol_type == SYMBOL_TYPE_FET:
+ [
+ _,
+ block,
+ (poly_net, diff_nets),
+ channel,
+ x,
+ y,
+ mass,
+ r_matrix
+ ] = symbols[i]
+ print(
+ symbol_type,
+ block,
+ poly_net,
+ len(diff_nets),
+ channel,
+ x,
+ y,
+ mass,
+ file = fout
+ )
+ for i in range(len(diff_nets)):
+ print(
+ ' ' + diff_nets[i],
+ ' '.join([str(j) for j in r_matrix[i]]),
+ file = fout
+ )
+ elif symbol_type == SYMBOL_TYPE_GATE:
+ [_, block, (y_net, expr)] = symbols[i]
+ print(symbol_type, block, y_net, len(expr), file = fout)
+ for i in expr:
+ print(' ' + ' '.join(i), file = fout)
+ elif symbol_type == SYMBOL_TYPE_XOR:
+ [_, block, (y_net, a_nets)] = symbols[i]
+ print(symbol_type, block, y_net, ' '.join(a_nets), file = fout)
+ elif symbol_type == SYMBOL_TYPE_TG_LATCH:
+ [_, block, (d_net, le_net, len_net, q_net, qn_net)] = symbols[i]
+ print(
+ symbol_type,
+ block,
+ d_net,
+ le_net,
+ len_net,
+ q_net,
+ qn_net,
+ file = fout
+ )
+ elif symbol_type == SYMBOL_TYPE_TG_LATCH_FB:
+ [_, block, (d_net, le_net, len_net, q_net, qn_net, fb_net)] = symbols[i]
+ print(
+ symbol_type,
+ block,
+ d_net,
+ le_net,
+ len_net,
+ q_net,
+ qn_net,
+ fb_net,
+ file = fout
+ )
+ elif (
+ symbol_type == SYMBOL_TYPE_SUPER or
+ symbol_type == SYMBOL_TYPE_NOT_SUPER
+ ):
+ [_, block, (a_net, y_net)] = symbols[i]
+ print(symbol_type, block, a_net, y_net, file = fout)
+ elif (
+ symbol_type == SYMBOL_TYPE_SUPER_OE or
+ symbol_type == SYMBOL_TYPE_NOT_SUPER_OE
+ ):
+ [_, block, (a_net, oen_net, y_net)] = symbols[i]
+ print(symbol_type, block, a_net, oen_net, y_net, file = fout)
+ elif symbol_type == SYMBOL_TYPE_NOR_SUPER:
+ [_, block, (a_net, b_net, y_net)] = symbols[i]
+ print(symbol_type, block, a_net, b_net, y_net, file = fout)
+ elif symbol_type == SYMBOL_TYPE_NOR_SUPER_HD:
+ [_, block, (a_net, b_net, y_net, hd_net)] = symbols[i]
+ print(symbol_type, block, a_net, b_net, y_net, hd_net, file = fout)
SYMBOL_TYPE_GATE = 1
N_SYMBOL_TYPES = 2
-if len(sys.argv) < 3:
- print(f'usage: {sys.argv[0]:s} symbols.txt net_gnd,net_vcc')
+if len(sys.argv) < 4:
+ print(f'usage: {sys.argv[0]:s} fets.txt gates.txt net_gnd,net_vcc')
sys.exit(1)
-symbols_txt = sys.argv[1]
-[net_gnd, net_vcc] = sys.argv[2].split(',')
+fets_txt = sys.argv[1]
+gates_txt = sys.argv[2]
+[net_gnd, net_vcc] = sys.argv[3].split(',')
+print('input')
nets = {}
symbols = []
-with open(symbols_txt) as fin:
+with open(fets_txt) as fin:
line = fin.readline()
while len(line):
fields = line.split()
finally:
nets[net][0] = False
+print('process')
for i in range(len(symbols)):
symbol_type = symbols[i][0]
if symbol_type == SYMBOL_TYPE_FET:
symbols[symbol1][0] = -1
symbols.append((SYMBOL_TYPE_GATE, block, (poly_net, expr)))
-for i in range(len(symbols)):
- symbol_type = symbols[i][0]
- if symbol_type == SYMBOL_TYPE_FET:
- [
- _,
- block,
- (poly_net, diff_nets),
- channel,
- x,
- y,
- mass,
- r_matrix
- ] = symbols[i]
- print(symbol_type, block, poly_net, len(diff_nets), channel, x, y, mass)
- for i in range(len(diff_nets)):
- print(' ' + diff_nets[i], ' '.join([str(j) for j in r_matrix[i]]))
- elif symbol_type == SYMBOL_TYPE_GATE:
- [_, block, (y_net, expr)] = symbols[i]
- print(symbol_type, block, y_net, len(expr))
- for i in expr:
- print(' ' + ' '.join(i))
+print('output')
+with open(gates_txt, 'w') as fout:
+ for i in range(len(symbols)):
+ symbol_type = symbols[i][0]
+ if symbol_type == SYMBOL_TYPE_FET:
+ [
+ _,
+ block,
+ (poly_net, diff_nets),
+ channel,
+ x,
+ y,
+ mass,
+ r_matrix
+ ] = symbols[i]
+ print(
+ symbol_type,
+ block,
+ poly_net,
+ len(diff_nets),
+ channel,
+ x,
+ y,
+ mass,
+ file = fout
+ )
+ for i in range(len(diff_nets)):
+ print(
+ ' ' + diff_nets[i],
+ ' '.join([str(j) for j in r_matrix[i]]),
+ file = fout
+ )
+ elif symbol_type == SYMBOL_TYPE_GATE:
+ [_, block, (y_net, expr)] = symbols[i]
+ print(symbol_type, block, y_net, len(expr), file = fout)
+ for i in expr:
+ print(' ' + ' '.join(i), file = fout)