aboutsummaryrefslogtreecommitdiff
path: root/go_utils.py
blob: 19a5955e66e7a17989fcc25222a5522b8fc4063e (plain)
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
import logging
import pprint
import sys

from constants import csrs
from shared_utils import InstrDict, signed

pp = pprint.PrettyPrinter(indent=2)
logging.basicConfig(level=logging.INFO, format="%(levelname)s:: %(message)s")


def make_go(instr_dict: InstrDict):

    args = " ".join(sys.argv)
    prelude = f"""// Code generated by {args}; DO NOT EDIT."""

    prelude += """
package riscv

import "cmd/internal/obj"

type inst struct {
	opcode uint32
	funct3 uint32
	rs1    uint32
	rs2    uint32
	csr    int64
	funct7 uint32
}

func encode(a obj.As) *inst {
	switch a {
"""

    csrs_map_str = """  }
	return nil
}

var csrs = map[uint16]string {
"""

    endoffile = """}
"""

    instr_str = ""
    for i in instr_dict:
        enc_match = int(instr_dict[i]["match"], 0)
        opcode = (enc_match >> 0) & ((1 << 7) - 1)
        funct3 = (enc_match >> 12) & ((1 << 3) - 1)
        rs1 = (enc_match >> 15) & ((1 << 5) - 1)
        rs2 = (enc_match >> 20) & ((1 << 5) - 1)
        csr = (enc_match >> 20) & ((1 << 12) - 1)
        funct7 = (enc_match >> 25) & ((1 << 7) - 1)
        instr_str += f"""  case A{i.upper().replace("_","")}:
    return &inst{{ {hex(opcode)}, {hex(funct3)}, {hex(rs1)}, {hex(rs2)}, {signed(csr,12)}, {hex(funct7)} }}
"""
    for num, name in sorted(csrs, key=lambda row: row[0]):
        csrs_map_str += f'{hex(num)} : "{name.upper()}",\n'

    with open("inst.go", "w", encoding="utf-8") as file:
        file.write(prelude)
        file.write(instr_str)
        file.write(csrs_map_str)
        file.write(endoffile)