From: Dmitry Selyutin Date: Fri, 2 Jun 2023 16:25:18 +0000 (+0300) Subject: pysvp64dis: integrate into insndb X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=refs%2Fheads%2Finsndb;p=openpower-isa.git pysvp64dis: integrate into insndb --- diff --git a/setup.py b/setup.py index 304b2c95..827d39be 100644 --- a/setup.py +++ b/setup.py @@ -83,7 +83,7 @@ setup( 'sv_analysis=openpower.sv.sv_analysis:main', 'pypowersim=openpower.decoder.isa.pypowersim:run_simulation', 'pysvp64asm=openpower.insndb.asm:main', - 'pysvp64dis=openpower.sv.trans.pysvp64dis:main' + 'pysvp64dis=openpower.insndb.dis:main' ] } ) diff --git a/src/openpower/insndb/dis.py b/src/openpower/insndb/dis.py new file mode 100644 index 00000000..720963ba --- /dev/null +++ b/src/openpower/insndb/dis.py @@ -0,0 +1,97 @@ +import argparse +import enum +import sys +import os + +from openpower.decoder.power_enums import ( + find_wiki_dir, +) +from openpower.insndb.types import ( + Style, + Database, + WordInstruction, + PrefixedInstruction, + SVP64Instruction, +) + + +class ByteOrder(enum.Enum): + LITTLE = "little" + BIG = "big" + + def __str__(self): + return self.name.lower() + + +def load(ifile, byteorder=ByteOrder.LITTLE, **_): + byteorder = str(byteorder) + + while True: + insn = ifile.read(4) + length = len(insn) + if length == 0: + return + elif length < 4: + raise IOError(insn) + insn = WordInstruction.integer(value=insn, byteorder=byteorder) + if insn.PO == 0x1: + suffix = ifile.read(4) + length = len(suffix) + if length == 0: + yield insn + return + elif length < 4: + raise IOError(suffix) + + prefix = insn + suffix = WordInstruction.integer(value=suffix, byteorder=byteorder) + insn = SVP64Instruction.pair(prefix=prefix, suffix=suffix) + if insn.prefix.id != 0b11: + insn = PrefixedInstruction.pair(prefix=prefix, suffix=suffix) + yield insn + + +def dump(insns, style, **_): + db = Database(find_wiki_dir()) + for insn in insns: + record = db[insn] + yield from insn.disassemble(record=record, style=style) + + +# this is the entry-point for the console-script pysvp64dis +def main(): + parser = argparse.ArgumentParser() + parser.add_argument("ifile", nargs="?", + type=argparse.FileType("rb"), default=sys.stdin.buffer) + parser.add_argument("ofile", nargs="?", + type=argparse.FileType("w"), default=sys.stdout) + parser.add_argument("-b", "--byteorder", + type=ByteOrder, default=ByteOrder.LITTLE) + parser.add_argument("-s", "--short", + dest="style", default=Style.NORMAL, + action="store_const", const=Style.SHORT) + parser.add_argument("-v", "--verbose", + dest="style", default=Style.NORMAL, + action="store_const", const=Style.VERBOSE) + parser.add_argument("-l", "--legacy", + dest="style", default=Style.NORMAL, + action="store_const", const=Style.LEGACY) + parser.add_argument("-L", "--log", + action="store_true", default=False) + + args = dict(vars(parser.parse_args())) + + # if logging requested do not disable it. + if not args['log']: + os.environ['SILENCELOG'] = '1' + + # load instructions and dump them + insns = load(**args) + for line in dump(insns, **args): + print(line, file=args["ofile"]) + + +# still here but use "python3 setup.py develop" then run the +# command "pysvp64dis" instead of "python3 src/openpower/sv/trans/pysvp64dis.py" +if __name__ == "__main__": + main() diff --git a/src/openpower/sv/trans/pysvp64dis.py b/src/openpower/sv/trans/pysvp64dis.py deleted file mode 100644 index 720963ba..00000000 --- a/src/openpower/sv/trans/pysvp64dis.py +++ /dev/null @@ -1,97 +0,0 @@ -import argparse -import enum -import sys -import os - -from openpower.decoder.power_enums import ( - find_wiki_dir, -) -from openpower.insndb.types import ( - Style, - Database, - WordInstruction, - PrefixedInstruction, - SVP64Instruction, -) - - -class ByteOrder(enum.Enum): - LITTLE = "little" - BIG = "big" - - def __str__(self): - return self.name.lower() - - -def load(ifile, byteorder=ByteOrder.LITTLE, **_): - byteorder = str(byteorder) - - while True: - insn = ifile.read(4) - length = len(insn) - if length == 0: - return - elif length < 4: - raise IOError(insn) - insn = WordInstruction.integer(value=insn, byteorder=byteorder) - if insn.PO == 0x1: - suffix = ifile.read(4) - length = len(suffix) - if length == 0: - yield insn - return - elif length < 4: - raise IOError(suffix) - - prefix = insn - suffix = WordInstruction.integer(value=suffix, byteorder=byteorder) - insn = SVP64Instruction.pair(prefix=prefix, suffix=suffix) - if insn.prefix.id != 0b11: - insn = PrefixedInstruction.pair(prefix=prefix, suffix=suffix) - yield insn - - -def dump(insns, style, **_): - db = Database(find_wiki_dir()) - for insn in insns: - record = db[insn] - yield from insn.disassemble(record=record, style=style) - - -# this is the entry-point for the console-script pysvp64dis -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("ifile", nargs="?", - type=argparse.FileType("rb"), default=sys.stdin.buffer) - parser.add_argument("ofile", nargs="?", - type=argparse.FileType("w"), default=sys.stdout) - parser.add_argument("-b", "--byteorder", - type=ByteOrder, default=ByteOrder.LITTLE) - parser.add_argument("-s", "--short", - dest="style", default=Style.NORMAL, - action="store_const", const=Style.SHORT) - parser.add_argument("-v", "--verbose", - dest="style", default=Style.NORMAL, - action="store_const", const=Style.VERBOSE) - parser.add_argument("-l", "--legacy", - dest="style", default=Style.NORMAL, - action="store_const", const=Style.LEGACY) - parser.add_argument("-L", "--log", - action="store_true", default=False) - - args = dict(vars(parser.parse_args())) - - # if logging requested do not disable it. - if not args['log']: - os.environ['SILENCELOG'] = '1' - - # load instructions and dump them - insns = load(**args) - for line in dump(insns, **args): - print(line, file=args["ofile"]) - - -# still here but use "python3 setup.py develop" then run the -# command "pysvp64dis" instead of "python3 src/openpower/sv/trans/pysvp64dis.py" -if __name__ == "__main__": - main() diff --git a/src/openpower/sv/trans/test_pysvp64dis.py b/src/openpower/sv/trans/test_pysvp64dis.py index b8a8fe2b..d8af280a 100644 --- a/src/openpower/sv/trans/test_pysvp64dis.py +++ b/src/openpower/sv/trans/test_pysvp64dis.py @@ -1,5 +1,5 @@ from openpower.simulator.program import Program -from openpower.sv.trans.pysvp64dis import load, dump +from openpower.insndb.dis import load, dump from openpower.insndb.asm import SVP64Asm from openpower.insndb.types import Database, Style from openpower.decoder.power_enums import find_wiki_dir diff --git a/src/openpower/sv/trans/test_pysvp64dis_branch.py b/src/openpower/sv/trans/test_pysvp64dis_branch.py index 44a215fb..99bb0990 100644 --- a/src/openpower/sv/trans/test_pysvp64dis_branch.py +++ b/src/openpower/sv/trans/test_pysvp64dis_branch.py @@ -1,5 +1,5 @@ from openpower.simulator.program import Program -from openpower.sv.trans.pysvp64dis import load, dump +from openpower.insndb.dis import load, dump from openpower.insndb.asm import SVP64Asm from openpower.insndb.types import Database, Style from openpower.decoder.power_enums import find_wiki_dir