summaryrefslogtreecommitdiff
path: root/parse-opcodes
diff options
context:
space:
mode:
authorGravatar Andrew Waterman <waterman@eecs.berkeley.edu>2013-11-25 01:43:47 -0800
committerGravatar Andrew Waterman <waterman@eecs.berkeley.edu>2013-11-25 01:43:47 -0800
commit2d11bac94537e08b30b8ace0eb39ecbbbc386c8e (patch)
tree5c9b9dcee1a2fe0e2fb666020d552a207daa8958 /parse-opcodes
parentbc445390566f8831dd8bb34bcc05d80c7401296a (diff)
New privileged ISA
Diffstat (limited to 'parse-opcodes')
-rwxr-xr-xparse-opcodes86
1 files changed, 71 insertions, 15 deletions
diff --git a/parse-opcodes b/parse-opcodes
index 3117b8e..8b4b2ea 100755
--- a/parse-opcodes
+++ b/parse-opcodes
@@ -40,6 +40,35 @@ arglut['cimm6'] = (15,10)
arglut['cimm10'] = (14,5)
arglut['cimm5'] = (9,5)
+csrs = {
+ 0x001 : 'fflags',
+ 0x002 : 'frm',
+ 0x003 : 'fcsr',
+ 0x004 : 'cycle',
+ 0x005 : 'time',
+ 0x006 : 'instret',
+ 0x500 : 'sup0',
+ 0x501 : 'sup1',
+ 0x502 : 'epc',
+ 0x503 : 'badvaddr',
+ 0x504 : 'ptbr',
+ 0x505 : 'asid',
+ 0x506 : 'count',
+ 0x507 : 'compare',
+ 0x508 : 'evec',
+ 0x509 : 'cause',
+ 0x50A : 'status',
+ 0x50B : 'hartid',
+ 0x50C : 'impl',
+ 0x50D : 'fatc',
+ 0x50E : 'send_ipi',
+ 0x50F : 'clear_ipi',
+ 0x51C : 'stats', # XXX
+ 0x51D : 'reset',
+ 0x51E : 'tohost',
+ 0x51F : 'fromhost',
+}
+
opcode_base = 0
opcode_size = 7
funct_base = 12
@@ -49,17 +78,28 @@ def binary(n, digits=0):
rep = bin(n)[2:]
return rep if digits == 0 else ('0' * (digits - len(rep))) + rep
-def make_disasm_table(match,mask):
+def make_c(match,mask):
print '/* Automatically generated by parse-opcodes */'
- for name,match in match.iteritems():
+ print '#ifndef RISCV_ENCODING_H'
+ print '#define RISCV_ENCODING_H'
+ for name in match.iterkeys():
name2 = name.upper().replace('.','_')
- print '#define MATCH_%s %s' % (name2, hex(match))
- print '#define MASK_%s %s' % (name2, hex(mask[name]))
+ print '#define MATCH_%s %s' % (name2, hex(match[name]))
+ print '#define MASK_%s %s' % (name2, hex(mask[name]))
+ for num, name in csrs.items():
+ print '#define CSR_%s %s' % (name.upper(), hex(num))
+ print '#endif'
-def make_isasim(match, mask):
+ print '#ifdef DECLARE_INSN'
for name in match.iterkeys():
name2 = name.replace('.','_')
- print 'DECLARE_INSN(%s, 0x%x, 0x%x)' % (name2, match[name], mask[name])
+ print 'DECLARE_INSN(%s, MATCH_%s, MASK_%s)' % (name2, name2.upper(), name2.upper())
+ print '#endif'
+
+ print '#ifdef DECLARE_CSR'
+ for num, name in csrs.items():
+ print 'DECLARE_CSR(%s, CSR_%s)' % (name, name.upper())
+ print '#endif'
def yank(num,start,len):
return (num >> start) & ((1 << len) - 1)
@@ -490,7 +530,7 @@ def make_latex_table():
print_insts('addi', 'slti', 'sltiu', 'xori', 'ori', 'andi', 'slli', 'srli', 'srai')
print_insts('add', 'sub', 'sll', 'slt', 'sltu', 'xor', 'srl', 'sra', 'or', 'and')
print_insts('fence', 'fence.i')
- print_insts('syscall', 'break', 'rdcycle', 'rdtime', 'rdinstret')
+ print_insts('scall', 'sbreak', 'rdcycle', 'rdtime', 'rdinstret')
print_footer(0)
print_header('r','a','i','s')
@@ -525,6 +565,8 @@ def make_latex_table():
print_insts('fcvt.w.s', 'fcvt.wu.s', 'fmv.x.s')
print_insts('feq.s', 'flt.s', 'fle.s')
print_insts('fssr', 'frsr')
+ print_insts('fsflags', 'frflags')
+ print_insts('fsrm', 'frrm')
print_footer(0)
print_header('r','r4','i','s')
@@ -555,9 +597,21 @@ def print_chisel_insn(name):
print s + "\")"
def make_chisel():
- print ' /* Automatically generated by parse-opcodes */'
+ print '/* Automatically generated by parse-opcodes */'
+ print 'object Instructions {'
for name in namelist:
print_chisel_insn(name)
+ print '}'
+ print 'object CSRs {'
+ for num, name in csrs.items():
+ print ' val %s = %d' % (name, num)
+ print ' val all = {'
+ print ' val res = collection.mutable.ArrayBuffer[Int]()'
+ for num, name in csrs.items():
+ print ' res += %s' % (name)
+ print ' res.toArray'
+ print ' }'
+ print '}'
for line in sys.stdin:
line = line.partition('#')
@@ -568,6 +622,9 @@ for line in sys.stdin:
assert len(tokens) >= 2
name = tokens[0]
+ pseudo = name[0] == '@'
+ if pseudo:
+ name = name[1:]
mymatch = 0
mymask = 0
cover = 0
@@ -610,9 +667,10 @@ for line in sys.stdin:
if not (cover == 0xFFFFFFFF or cover == 0xFFFF):
sys.exit("%s: not all bits are covered" % name)
- for name2,match2 in match.iteritems():
- if (match2 & mymask) == mymatch:
- sys.exit("%s and %s overlap" % (name,name2))
+ if not pseudo:
+ for name2,match2 in match.iteritems():
+ if (match2 & mymask) == mymatch:
+ sys.exit("%s and %s overlap" % (name,name2))
mask[name] = mymask
match[name] = mymatch
@@ -622,9 +680,7 @@ if sys.argv[1] == '-tex':
make_latex_table()
elif sys.argv[1] == '-chisel':
make_chisel()
-elif sys.argv[1] == '-disasm':
- make_disasm_table(match,mask)
-elif sys.argv[1] == '-isasim':
- make_isasim(match,mask)
+elif sys.argv[1] == '-c':
+ make_c(match,mask)
else:
assert 0