-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmicrocodigo.py
executable file
·95 lines (73 loc) · 2.35 KB
/
microcodigo.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/env python3
import csv
import sys
import yaml
"""
Versao usando o uCodigo em yaml .,
"""
arquivoMicrocodigo = "microcodigo.hex"
"""
Formato do arquivo hex do Digital HNeeman
v2.0 raw
>> uma linha por endereco
"""
class hneemanHex:
def __init__(self, fname):
self.conteudo = {}
self.fname = fname
def addValue(self, addr, value):
self.conteudo[addr] = value
def geraHex(self):
with open(self.fname,'w') as F:
print( 'v2.0 raw', file=F )
Add = 0
print( dict(sorted(self.conteudo.items())) )
for A, V in dict(sorted(self.conteudo.items())).items():
if A != Add:
print( '{}*0'.format( A - Add ) , file=F)
Add = A
print( '{:4X}'.format( V ) , file=F)
Add = Add + 1
def uInstrucao( codigo, passos ):
# Tempos dessa instrucao
uC = {}
print( codigo, passos )
for P in range(len(passos) ):
addruInstr = int( '0b{:04b}{:03b}'.format(codigo,P), 2)
bC = 0
for x in [ 1<<b for b in passos[P] ]:
bC |= x
uC[addruInstr] = bC
print( codigo, P, '@{:04b}{:03b}'.format(codigo, P) , '{:016b}'.format(bC), '{:04X}'.format(bC) )
return uC
# Fonte do microcodigo
uCodigoFonte = 'microcodigo.yaml'
with open(uCodigoFonte,'rt', encoding='utf-8') as uC:
uCodigo = yaml.safe_load(uC)
#
# controlBusBits
#
# Esta no yaml e agora tem o controle do barramento
# os Bits estao codificados com as instrucoes e as
# micro instrucoes de HW.,
# Ajudara na sintaxe para o assembler,.
# LUT do microcodigo para o DIGITAL
FMicroCodigo = 'microcodigo.hex'
F = hneemanHex(arquivoMicrocodigo)
#
nBitsInstrucao = 4
# Indice o uCodigo = Codigo da instrucao
# Total de instrucoes possiveis >> 2^nBitsInstrucao -1 .
# o RANGE no python é de dominio aberto , ... até (n-1) comecando em 0 ...
instrPopulados = []
for opCd, Det in uCodigo['opCodes'].items():
if Det['cdInstrucao'] is None:
continue
instrPopulados.append(Det['cdInstrucao'])
for K,V in uInstrucao( Det['cdInstrucao'], Det['uCodigo'] ).items():
F.addValue( K,V )
S = [ X for X in range(16) if X not in instrPopulados ]
for I in S:
for K,V in uInstrucao( I, uCodigo['opCodes']['NOP']['uCodigo'] ).items():
F.addValue( K, V )
F.geraHex()