36
36
from .kevm import KEVM , KEVMSemantics , kevm_node_printer
37
37
from .kompile import KompileTarget , kevm_kompile
38
38
from .utils import (
39
+ arg_pair_of ,
39
40
claim_dependency_dict ,
40
41
ensure_ksequence_on_k_cell ,
41
42
get_apr_proof_for_spec ,
@@ -478,7 +479,7 @@ def _init_and_run_proof(claim_job: KClaimJob) -> tuple[bool, list[str] | None]:
478
479
sys .exit (failed )
479
480
480
481
481
- def exec_prune_proof (
482
+ def exec_prune (
482
483
definition_dir : Path ,
483
484
spec_file : Path ,
484
485
node : NodeIdLike ,
@@ -493,9 +494,8 @@ def exec_prune_proof(
493
494
md_selector = 'k'
494
495
495
496
if save_directory is None :
496
- raise ValueError ('Must pass --save-directory to prune-proof !' )
497
+ raise ValueError ('Must pass --save-directory to prune!' )
497
498
498
- _LOGGER .warning (f'definition_dir: { definition_dir } ' )
499
499
kevm = KEVM (definition_dir , use_directory = save_directory )
500
500
501
501
include_dirs = [Path (include ) for include in includes ]
@@ -519,6 +519,75 @@ def exec_prune_proof(
519
519
apr_proof .write_proof_data ()
520
520
521
521
522
+ def exec_section_edge (
523
+ definition_dir : Path ,
524
+ spec_file : Path ,
525
+ edge : tuple [str , str ],
526
+ sections : int = 2 ,
527
+ includes : Iterable [str ] = (),
528
+ save_directory : Path | None = None ,
529
+ spec_module : str | None = None ,
530
+ claim_labels : Iterable [str ] | None = None ,
531
+ exclude_claim_labels : Iterable [str ] = (),
532
+ smt_timeout : int | None = None ,
533
+ smt_retry_limit : int | None = None ,
534
+ kore_rpc_command : str | Iterable [str ] | None = None ,
535
+ trace_rewrites : bool = False ,
536
+ bug_report : BugReport | None = None ,
537
+ use_booster : bool = False ,
538
+ ** kwargs : Any ,
539
+ ) -> None :
540
+ md_selector = 'k'
541
+
542
+ if save_directory is None :
543
+ raise ValueError ('Must pass --save-directory to section-edge!' )
544
+
545
+ if kore_rpc_command is None :
546
+ kore_rpc_command = ('kore-rpc-booster' ,) if use_booster else ('kore-rpc' ,)
547
+ elif isinstance (kore_rpc_command , str ):
548
+ kore_rpc_command = kore_rpc_command .split ()
549
+
550
+ if smt_timeout is None :
551
+ smt_timeout = 300
552
+ if smt_retry_limit is None :
553
+ smt_retry_limit = 10
554
+
555
+ kevm = KEVM (definition_dir , use_directory = save_directory )
556
+ llvm_definition_dir = definition_dir / 'llvm-library' if use_booster else None
557
+
558
+ include_dirs = [Path (include ) for include in includes ]
559
+ include_dirs += config .INCLUDE_DIRS
560
+
561
+ claim = single (
562
+ kevm .get_claims (
563
+ spec_file ,
564
+ spec_module_name = spec_module ,
565
+ include_dirs = include_dirs ,
566
+ md_selector = md_selector ,
567
+ claim_labels = claim_labels ,
568
+ exclude_claim_labels = exclude_claim_labels ,
569
+ )
570
+ )
571
+
572
+ proof = APRProof .read_proof_data (save_directory , claim .label )
573
+ source_id , target_id = edge
574
+ with legacy_explore (
575
+ kevm ,
576
+ kcfg_semantics = KEVMSemantics (),
577
+ id = proof .id ,
578
+ bug_report = bug_report ,
579
+ kore_rpc_command = kore_rpc_command ,
580
+ smt_timeout = smt_timeout ,
581
+ smt_retry_limit = smt_retry_limit ,
582
+ trace_rewrites = trace_rewrites ,
583
+ llvm_definition_dir = llvm_definition_dir ,
584
+ ) as kcfg_explore :
585
+ kcfg , _ = kcfg_explore .section_edge (
586
+ proof .kcfg , source_id = int (source_id ), target_id = int (target_id ), logs = proof .logs , sections = sections
587
+ )
588
+ proof .write_proof_data ()
589
+
590
+
522
591
def exec_show_kcfg (
523
592
definition_dir : Path ,
524
593
spec_file : Path ,
@@ -743,16 +812,37 @@ def parse(s: str) -> list[T]:
743
812
help = 'Reinitialize CFGs even if they already exist.' ,
744
813
)
745
814
746
- prune_proof_args = command_parser .add_parser (
747
- 'prune-proof ' ,
815
+ prune_args = command_parser .add_parser (
816
+ 'prune' ,
748
817
help = 'Remove a node and its successors from the proof state.' ,
749
818
parents = [
750
819
kevm_cli_args .logging_args ,
751
820
kevm_cli_args .k_args ,
752
821
kevm_cli_args .spec_args ,
753
822
],
754
823
)
755
- prune_proof_args .add_argument ('node' , type = node_id_like , help = 'Node to remove CFG subgraph from.' )
824
+ prune_args .add_argument ('node' , type = node_id_like , help = 'Node to remove CFG subgraph from.' )
825
+
826
+ section_edge_args = command_parser .add_parser (
827
+ 'section-edge' ,
828
+ help = 'Break an edge into sections.' ,
829
+ parents = [
830
+ kevm_cli_args .logging_args ,
831
+ kevm_cli_args .k_args ,
832
+ kevm_cli_args .spec_args ,
833
+ ],
834
+ )
835
+ section_edge_args .add_argument ('edge' , type = arg_pair_of (str , str ), help = 'Edge to section in CFG.' )
836
+ section_edge_args .add_argument (
837
+ '--sections' , type = int , default = 2 , help = 'Number of sections to make from edge (>= 2).'
838
+ )
839
+ section_edge_args .add_argument (
840
+ '--use-booster' ,
841
+ dest = 'use_booster' ,
842
+ default = False ,
843
+ action = 'store_true' ,
844
+ help = "Use the booster RPC server instead of kore-rpc. Requires calling kompile with '--target haskell-booster' flag" ,
845
+ )
756
846
757
847
prove_legacy_args = command_parser .add_parser (
758
848
'prove-legacy' ,
0 commit comments