diff --git a/dvf2svd.py b/dvf2svd.py new file mode 100755 index 0000000..2e48412 --- /dev/null +++ b/dvf2svd.py @@ -0,0 +1,103 @@ +#!/usr/bin/env python3 + +import argparse, sys, os + +sys.path.append(os.path.dirname(os.path.abspath(__file__))+"/svd") +from dvf import dvfparse +#from svd import svd, svdparse, svdgen +import svd, svdparse, svdgen +from typing import * + +WIDTHS = { + dvfparse.Dvf.MCU_78K0: 16, + dvfparse.Dvf.MCU_78K0R: 20, + dvfparse.Dvf.MCU_RL78x1y: 20, + dvfparse.Dvf.MCU_RL78x2y: 20, +} +SERIES = { + # TODO: better categorization in subtypes and stuff + dvfparse.Dvf.MCU_78K0: "78K0(S)", + dvfparse.Dvf.MCU_78K0R: "78K0R", + dvfparse.Dvf.MCU_RL78x1y: "RL78/x1y", + dvfparse.Dvf.MCU_RL78x2y: "RL78/x2y", +} +CPUS = { + # TODO: better categorization in subtypes and stuff + dvfparse.Dvf.MCU_78K0: "78K0(S)", + dvfparse.Dvf.MCU_78K0R: "78K0R", + dvfparse.Dvf.MCU_RL78x1y: "RL78/S[13]", + dvfparse.Dvf.MCU_RL78x2y: "RL78/S3", +} + +def conv_per(dvf: dvfparse.Dvf) -> List[svd.SvdPeripheral]: + r=[] + base = 0xFFF00 & ((1< svd.SvdDevice: + md = dvf.sections[dvfparse.DvfSect.MD][0] + return svd.SvdDevice( + vendor="Renesas", + vendorID="Renesas", + name=dvf.chipname_disp, + series=SERIES[dvf.mcutype], + description=md.version + " " + md.timestamp, + licenseText=dvf.copyright_notice, + addressUnitBits=8, + width=16,#WIDTHS[dvf.mcutype], + cpu=svd.SvdCpu( + name=CPUS[dvf.mcutype], + endian='little', + deviceNumInterrupts=len(dvf.sections[dvfparse.DvfSect.VN]), + ), + peripherals=conv_per(dvf), + # TODO: MI to memory map somehow? + ) + + +if __name__ == '__main__': + parser = argparse.ArgumentParser(prog="dvf2h", + description="Convert NEC/Renesas Device "+\ + "Files to CMSIS-SVD files") + + parser.add_argument('input', type=argparse.FileType('rb')) + #parser.add_argument('output', type=argparse.FileType('w')) + parser.add_argument('output', type=str, default=None) + + + args = parser.parse_args() + output = sys.stdout if args.output is None else open(args.output, 'w') + + try: + dvffile = dvfparse.Dvf.parse(args.input.read()) + svdc = conv(dvffile) + svdgen.generate(output, svdc) + finally: + if args.output is not None: + output.close() +