From: Sebastien Bourdeauducq Date: Thu, 30 May 2013 19:38:21 +0000 (+0200) Subject: cif: move to milkymist folder X-Git-Tag: 24jan2021_ls180~2913 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=6d71e09281bfba4fabd55dc2b1fdd59d32bf5254;p=litex.git cif: move to milkymist folder --- diff --git a/build.py b/build.py index 73bd7720..b345a5c9 100755 --- a/build.py +++ b/build.py @@ -5,8 +5,9 @@ import os from mibuild.platforms import m1 from mibuild.tools import write_to_file +from milkymist import cif + import top -import cif def main(): platform = m1.Platform() diff --git a/cif.py b/cif.py deleted file mode 100644 index ace7b2af..00000000 --- a/cif.py +++ /dev/null @@ -1,66 +0,0 @@ -from operator import itemgetter -import re - -from migen.bank.description import CSRStatus - -def get_macros(filename): - f = open(filename, "r") - r = {} - for line in f: - match = re.match("\w*#define\s+(\w+)\s+(.*)", line, re.IGNORECASE) - if match: - r[match.group(1)] = match.group(2) - return r - -def _get_rw_functions(reg_name, reg_base, size, read_only): - r = "" - if size > 8: - raise NotImplementedError("Register too large") - elif size > 4: - ctype = "unsigned long long int" - elif size > 2: - ctype = "unsigned int" - elif size > 1: - ctype = "unsigned short int" - else: - ctype = "unsigned char" - - r += "static inline "+ctype+" "+reg_name+"_read(void) {\n" - if size > 1: - r += "\t"+ctype+" r = MMPTR("+hex(reg_base)+");\n" - for byte in range(1, size): - r += "\tr <<= 8;\n\tr |= MMPTR("+hex(reg_base+4*byte)+");\n" - r += "\treturn r;\n}\n" - else: - r += "\treturn MMPTR("+hex(reg_base)+");\n}\n" - - if not read_only: - r += "static inline void "+reg_name+"_write("+ctype+" value) {\n" - for byte in range(size): - shift = (size-byte-1)*8 - if shift: - value_shifted = "value >> "+str(shift) - else: - value_shifted = "value" - r += "\tMMPTR("+hex(reg_base+4*byte)+") = "+value_shifted+";\n" - r += "}\n" - return r - -def get_csr_header(csr_base, bank_array, interrupt_map): - r = "#ifndef __HW_CSR_H\n#define __HW_CSR_H\n#include \n" - for name, csrs, mapaddr, rmap in bank_array.banks: - r += "\n/* "+name+" */\n" - reg_base = csr_base + 0x800*mapaddr - r += "#define "+name.upper()+"_BASE "+hex(reg_base)+"\n" - for csr in csrs: - nr = (csr.size + 7)//8 - r += _get_rw_functions(name + "_" + csr.name, reg_base, nr, isinstance(csr, CSRStatus)) - reg_base += 4*nr - try: - interrupt_nr = interrupt_map[name] - except KeyError: - pass - else: - r += "#define "+name.upper()+"_INTERRUPT "+str(interrupt_nr)+"\n" - r += "\n#endif\n" - return r diff --git a/milkymist/cif.py b/milkymist/cif.py new file mode 100644 index 00000000..ace7b2af --- /dev/null +++ b/milkymist/cif.py @@ -0,0 +1,66 @@ +from operator import itemgetter +import re + +from migen.bank.description import CSRStatus + +def get_macros(filename): + f = open(filename, "r") + r = {} + for line in f: + match = re.match("\w*#define\s+(\w+)\s+(.*)", line, re.IGNORECASE) + if match: + r[match.group(1)] = match.group(2) + return r + +def _get_rw_functions(reg_name, reg_base, size, read_only): + r = "" + if size > 8: + raise NotImplementedError("Register too large") + elif size > 4: + ctype = "unsigned long long int" + elif size > 2: + ctype = "unsigned int" + elif size > 1: + ctype = "unsigned short int" + else: + ctype = "unsigned char" + + r += "static inline "+ctype+" "+reg_name+"_read(void) {\n" + if size > 1: + r += "\t"+ctype+" r = MMPTR("+hex(reg_base)+");\n" + for byte in range(1, size): + r += "\tr <<= 8;\n\tr |= MMPTR("+hex(reg_base+4*byte)+");\n" + r += "\treturn r;\n}\n" + else: + r += "\treturn MMPTR("+hex(reg_base)+");\n}\n" + + if not read_only: + r += "static inline void "+reg_name+"_write("+ctype+" value) {\n" + for byte in range(size): + shift = (size-byte-1)*8 + if shift: + value_shifted = "value >> "+str(shift) + else: + value_shifted = "value" + r += "\tMMPTR("+hex(reg_base+4*byte)+") = "+value_shifted+";\n" + r += "}\n" + return r + +def get_csr_header(csr_base, bank_array, interrupt_map): + r = "#ifndef __HW_CSR_H\n#define __HW_CSR_H\n#include \n" + for name, csrs, mapaddr, rmap in bank_array.banks: + r += "\n/* "+name+" */\n" + reg_base = csr_base + 0x800*mapaddr + r += "#define "+name.upper()+"_BASE "+hex(reg_base)+"\n" + for csr in csrs: + nr = (csr.size + 7)//8 + r += _get_rw_functions(name + "_" + csr.name, reg_base, nr, isinstance(csr, CSRStatus)) + reg_base += 4*nr + try: + interrupt_nr = interrupt_map[name] + except KeyError: + pass + else: + r += "#define "+name.upper()+"_INTERRUPT "+str(interrupt_nr)+"\n" + r += "\n#endif\n" + return r diff --git a/top.py b/top.py index 6dbb0f54..fabfe623 100644 --- a/top.py +++ b/top.py @@ -9,7 +9,7 @@ from migen.bank import csrgen from milkymist import m1crg, lm32, norflash, uart, s6ddrphy, dfii, asmicon, \ identifier, timer, minimac3, framebuffer, asmiprobe, dvisampler, \ counteradc, gpio -from cif import get_macros +from milkymist.cif import get_macros version = get_macros("common/version.h")["VERSION"][1:-1]