20
20
from .linker import link
21
21
from .options import (
22
22
GenSpecOpts ,
23
+ InfoOpts ,
23
24
LinkOpts ,
24
25
ProveRawOpts ,
25
26
ProveRSOpts ,
30
31
ViewOpts ,
31
32
)
32
33
from .parse .parser import parse_json
33
- from .smir import SMIRInfo
34
+ from .smir import SMIRInfo , Ty
34
35
35
36
if TYPE_CHECKING :
36
37
from argparse import Namespace
@@ -130,14 +131,38 @@ def _kmir_view(opts: ViewOpts) -> None:
130
131
131
132
132
133
def _kmir_show (opts : ShowOpts ) -> None :
134
+ from pyk .kast .pretty import PrettyPrinter
135
+
136
+ from .kprint import KMIRPrettyPrinter
137
+
133
138
kmir = KMIR (HASKELL_DEF_DIR , LLVM_LIB_DIR )
134
139
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 ))
138
154
node_printer = KMIRAPRNodePrinter (cterm_show , proof , opts )
139
155
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
+ )
141
166
print ('\n ' .join (lines ))
142
167
143
168
@@ -164,6 +189,16 @@ def _kmir_prune(opts: PruneOpts) -> None:
164
189
proof .write_proof_data ()
165
190
166
191
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
+
167
202
def _kmir_link (opts : LinkOpts ) -> None :
168
203
result = link ([SMIRInfo .from_file (f ) for f in opts .smir_files ])
169
204
result .dump (opts .output_file )
@@ -178,6 +213,8 @@ def kmir(args: Sequence[str]) -> None:
178
213
_kmir_run (opts )
179
214
case GenSpecOpts ():
180
215
_kmir_gen_spec (opts )
216
+ case InfoOpts ():
217
+ _kmir_info (opts )
181
218
case ProveRawOpts ():
182
219
_kmir_prove_raw (opts )
183
220
case ViewOpts ():
@@ -221,6 +258,12 @@ def _arg_parser() -> ArgumentParser:
221
258
'--start-symbol' , type = str , metavar = 'SYMBOL' , default = 'main' , help = 'Symbol name to begin execution from'
222
259
)
223
260
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
+
224
267
prove_args = ArgumentParser (add_help = False )
225
268
prove_args .add_argument ('--proof-dir' , metavar = 'DIR' , help = 'Proof directory' )
226
269
prove_args .add_argument ('--bug-report' , metavar = 'PATH' , help = 'path to optional bug report' )
@@ -247,11 +290,11 @@ def _arg_parser() -> ArgumentParser:
247
290
248
291
display_args = ArgumentParser (add_help = False )
249
292
display_args .add_argument (
250
- '--no- full-printer' ,
293
+ '--full-printer' ,
251
294
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.' ,
255
298
)
256
299
display_args .add_argument (
257
300
'--smir-info' ,
@@ -268,9 +311,30 @@ def _arg_parser() -> ArgumentParser:
268
311
help = 'Display the <currentBody> cell completely.' ,
269
312
)
270
313
271
- command_parser .add_parser (
314
+ show_parser = command_parser .add_parser (
272
315
'show' , help = 'Show proof information' , parents = [kcli_args .logging_args , proof_args , display_args ]
273
316
)
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
+ )
274
338
275
339
show_rules_parser = command_parser .add_parser (
276
340
'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:
324
388
)
325
389
case 'gen-spec' :
326
390
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 )
327
393
case 'prove' :
328
394
proof_dir = Path (ns .proof_dir )
329
395
return ProveRawOpts (
@@ -343,6 +409,11 @@ def _parse_args(ns: Namespace) -> KMirOpts:
343
409
full_printer = ns .full_printer ,
344
410
smir_info = Path (ns .smir_info ) if ns .smir_info else None ,
345
411
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 ,
346
417
)
347
418
case 'show-rules' :
348
419
return ShowRulesOpts (
0 commit comments