2020from .linker import link
2121from .options import (
2222 GenSpecOpts ,
23+ InfoOpts ,
2324 LinkOpts ,
2425 ProveRawOpts ,
2526 ProveRSOpts ,
3031 ViewOpts ,
3132)
3233from .parse .parser import parse_json
33- from .smir import SMIRInfo
34+ from .smir import SMIRInfo , Ty
3435
3536if TYPE_CHECKING :
3637 from argparse import Namespace
@@ -130,14 +131,38 @@ def _kmir_view(opts: ViewOpts) -> None:
130131
131132
132133def _kmir_show (opts : ShowOpts ) -> None :
134+ from pyk .kast .pretty import PrettyPrinter
135+
136+ from .kprint import KMIRPrettyPrinter
137+
133138 kmir = KMIR (HASKELL_DEF_DIR , LLVM_LIB_DIR )
134139 proof = APRProof .read_proof_data (opts .proof_dir , opts .id )
135- printer = PrettyPrinter (kmir .definition )
136- omit_labels = ('<currentBody>' ,) if opts .omit_current_body else ()
137- cterm_show = CTermShow (printer .print , omit_labels = omit_labels )
140+
141+ # Use custom KMIR printer by default, switch to standard printer if requested
142+ if opts .use_default_printer :
143+ printer = PrettyPrinter (kmir .definition )
144+ _LOGGER .info ('Using standard PrettyPrinter' )
145+ else :
146+ printer = KMIRPrettyPrinter (kmir .definition )
147+ _LOGGER .info ('Using custom KMIRPrettyPrinter' )
148+
149+ all_omit_cells = list (opts .omit_cells or ())
150+ if opts .omit_current_body :
151+ all_omit_cells .append ('<currentBody>' )
152+
153+ cterm_show = CTermShow (printer .print , omit_labels = tuple (all_omit_cells ))
138154 node_printer = KMIRAPRNodePrinter (cterm_show , proof , opts )
139155 shower = APRProofShow (kmir .definition , node_printer = node_printer )
140- lines = shower .show (proof )
156+ shower .kcfg_show .pretty_printer = printer
157+ _LOGGER .info (
158+ f'Showing { proof .id } with\n nodes: { opts .nodes } ,\n node_deltas: { opts .node_deltas } ,\n omit_cells: { tuple (all_omit_cells )} '
159+ )
160+ lines = shower .show (
161+ proof ,
162+ nodes = opts .nodes or (),
163+ node_deltas = opts .node_deltas or (),
164+ omit_cells = tuple (all_omit_cells ),
165+ )
141166 print ('\n ' .join (lines ))
142167
143168
@@ -164,6 +189,16 @@ def _kmir_prune(opts: PruneOpts) -> None:
164189 proof .write_proof_data ()
165190
166191
192+ def _kmir_info (opts : InfoOpts ) -> None :
193+ smir_info = SMIRInfo .from_file (opts .smir_file )
194+
195+ if opts .types :
196+ print (f'\n Types requested: { opts .types } ' )
197+ chosen_types = [Ty (type_id ) for type_id in opts .types ]
198+ for type_id in chosen_types :
199+ print (f'Type { type_id } : { smir_info .unref_type (type_id )} ' )
200+
201+
167202def _kmir_link (opts : LinkOpts ) -> None :
168203 result = link ([SMIRInfo .from_file (f ) for f in opts .smir_files ])
169204 result .dump (opts .output_file )
@@ -178,6 +213,8 @@ def kmir(args: Sequence[str]) -> None:
178213 _kmir_run (opts )
179214 case GenSpecOpts ():
180215 _kmir_gen_spec (opts )
216+ case InfoOpts ():
217+ _kmir_info (opts )
181218 case ProveRawOpts ():
182219 _kmir_prove_raw (opts )
183220 case ViewOpts ():
@@ -221,6 +258,12 @@ def _arg_parser() -> ArgumentParser:
221258 '--start-symbol' , type = str , metavar = 'SYMBOL' , default = 'main' , help = 'Symbol name to begin execution from'
222259 )
223260
261+ info_parser = command_parser .add_parser (
262+ 'info' , help = 'Show information about a SMIR JSON file' , parents = [kcli_args .logging_args ]
263+ )
264+ info_parser .add_argument ('smir_file' , metavar = 'FILE' , help = 'SMIR JSON file to analyze' )
265+ info_parser .add_argument ('--types' , metavar = 'TYPES' , help = 'Comma separated list of type IDs to show details for' )
266+
224267 prove_args = ArgumentParser (add_help = False )
225268 prove_args .add_argument ('--proof-dir' , metavar = 'DIR' , help = 'Proof directory' )
226269 prove_args .add_argument ('--bug-report' , metavar = 'PATH' , help = 'path to optional bug report' )
@@ -247,11 +290,11 @@ def _arg_parser() -> ArgumentParser:
247290
248291 display_args = ArgumentParser (add_help = False )
249292 display_args .add_argument (
250- '--no- full-printer' ,
293+ '--full-printer' ,
251294 dest = 'full_printer' ,
252- action = 'store_false ' ,
253- default = True ,
254- help = 'Do not display the full node in output.' ,
295+ action = 'store_true ' ,
296+ default = False ,
297+ help = 'Display the full node in output.' ,
255298 )
256299 display_args .add_argument (
257300 '--smir-info' ,
@@ -268,9 +311,30 @@ def _arg_parser() -> ArgumentParser:
268311 help = 'Display the <currentBody> cell completely.' ,
269312 )
270313
271- command_parser .add_parser (
314+ show_parser = command_parser .add_parser (
272315 'show' , help = 'Show proof information' , parents = [kcli_args .logging_args , proof_args , display_args ]
273316 )
317+ show_parser .add_argument ('--nodes' , metavar = 'NODES' , help = 'Comma separated list of node IDs to show' )
318+ show_parser .add_argument (
319+ '--node-deltas' , metavar = 'DELTAS' , help = 'Comma separated list of node deltas in format "source:target"'
320+ )
321+ show_parser .add_argument (
322+ '--omit-cells' , metavar = 'CELLS' , help = 'Comma separated list of cell names to omit from output'
323+ )
324+ show_parser .add_argument (
325+ '--no-omit-static-info' ,
326+ dest = 'omit_static_info' ,
327+ action = 'store_false' ,
328+ default = True ,
329+ help = 'Display static information cells (functions, start-symbol, types, adt-to-ty)' ,
330+ )
331+ show_parser .add_argument (
332+ '--use-default-printer' ,
333+ dest = 'use_default_printer' ,
334+ action = 'store_true' ,
335+ default = False ,
336+ help = 'Use standard PrettyPrinter instead of custom KMIR printer' ,
337+ )
274338
275339 show_rules_parser = command_parser .add_parser (
276340 'show-rules' , help = 'Show rules applied on a specific edge' , parents = [kcli_args .logging_args , proof_args ]
@@ -324,6 +388,8 @@ def _parse_args(ns: Namespace) -> KMirOpts:
324388 )
325389 case 'gen-spec' :
326390 return GenSpecOpts (input_file = Path (ns .input_file ), output_file = ns .output_file , start_symbol = ns .start_symbol )
391+ case 'info' :
392+ return InfoOpts (smir_file = Path (ns .smir_file ), types = ns .types )
327393 case 'prove' :
328394 proof_dir = Path (ns .proof_dir )
329395 return ProveRawOpts (
@@ -343,6 +409,11 @@ def _parse_args(ns: Namespace) -> KMirOpts:
343409 full_printer = ns .full_printer ,
344410 smir_info = Path (ns .smir_info ) if ns .smir_info else None ,
345411 omit_current_body = ns .omit_current_body ,
412+ nodes = ns .nodes ,
413+ node_deltas = ns .node_deltas ,
414+ omit_cells = ns .omit_cells ,
415+ omit_static_info = ns .omit_static_info ,
416+ use_default_printer = ns .use_default_printer ,
346417 )
347418 case 'show-rules' :
348419 return ShowRulesOpts (
0 commit comments