@@ -579,7 +579,7 @@ def run(self):
579
579
self .tasks = []
580
580
for task in tasks :
581
581
task .check_timeout ()
582
- if task .procs_pending or task .procs_running :
582
+ if task .procs_pending or task .procs_running or task . stages_running :
583
583
self .tasks .append (task )
584
584
else :
585
585
task .exit_callback ()
@@ -619,6 +619,9 @@ def __init__(self, sbyconfig, workdir, early_logs, reusedir, taskloop=None, logf
619
619
self .taskloop = taskloop or SbyTaskloop ()
620
620
self .taskloop .tasks .append (self )
621
621
622
+ self .base_dependencies = []
623
+ self .stages_running = []
624
+
622
625
self .procs_running = []
623
626
self .procs_pending = []
624
627
@@ -803,7 +806,7 @@ def make_model(self, model_name):
803
806
proc = SbyProc (
804
807
self ,
805
808
model_name ,
806
- [] ,
809
+ self . base_dependencies ,
807
810
"cd {}/src; {} -ql ../model/design.log ../model/design.ys" .format (self .workdir , self .exe_paths ["yosys" ])
808
811
)
809
812
proc .checkretcode = True
@@ -992,6 +995,8 @@ def handle_non_engine_options(self):
992
995
993
996
self .handle_str_option ("make_model" , None )
994
997
998
+ self .handle_str_option ("stage_hack" , None )
999
+
995
1000
def setup_procs (self , setupmode ):
996
1001
self .handle_non_engine_options ()
997
1002
if self .opt_smtc is not None :
@@ -1019,6 +1024,27 @@ def setup_procs(self, setupmode):
1019
1024
self .retcode = 0
1020
1025
return
1021
1026
1027
+ if self .opt_stage_hack is not None :
1028
+ # TODO replace with actual configs generated for the stages
1029
+ self .setup_stage (setupmode , config = [
1030
+ "[options]" ,
1031
+ "mode bmc" ,
1032
+ "[engines]" ,
1033
+ "smtbmc" ,
1034
+ "[script]" ,
1035
+ "read_rtlil ../../model/design.il" ,
1036
+ "setundef -zero"
1037
+ ], name = "bmc_zero" , depends = self .make_model ("base" ))
1038
+ self .setup_stage (setupmode , config = [
1039
+ "[options]" ,
1040
+ "mode bmc" ,
1041
+ "[engines]" ,
1042
+ "smtbmc" ,
1043
+ "[script]" ,
1044
+ "read_rtlil ../../model/design.il" ,
1045
+ "setundef -one"
1046
+ ], name = "bmc_one" , depends = self .make_model ("base" ))
1047
+
1022
1048
if self .opt_make_model is not None :
1023
1049
for name in self .opt_make_model .split ("," ):
1024
1050
self .model (name .strip ())
@@ -1049,6 +1075,12 @@ def setup_procs(self, setupmode):
1049
1075
if opt not in self .used_options :
1050
1076
self .error (f"Unused option: { opt } " )
1051
1077
1078
+ def setup_stage (self , setupmode , config , name , depends ):
1079
+ stage = SbyStage (config , self , name )
1080
+ stage .base_dependencies .extend (depends )
1081
+ self .stages_running .append (stage )
1082
+ stage .setup_procs (setupmode )
1083
+
1052
1084
def summarize (self ):
1053
1085
total_clock_time = int (monotonic () - self .start_clock_time )
1054
1086
@@ -1179,3 +1211,22 @@ def print_junit_result(self, f, junit_ts_name, junit_tc_name, junit_format_stric
1179
1211
print ('</system-err>' , file = f )
1180
1212
print (f'</testsuite>' , file = f )
1181
1213
print (f'</testsuites>' , file = f )
1214
+
1215
+
1216
+ class SbyStage (SbyTask ):
1217
+ def __init__ (self , sbyconfig , main_task , name ):
1218
+ self .main_task = main_task
1219
+ self .name = name
1220
+ workdir = f"{ main_task .workdir } /stage_{ name } "
1221
+ os .mkdir (workdir )
1222
+ super ().__init__ (
1223
+ sbyconfig , workdir = workdir , early_logs = [],
1224
+ reusedir = False , taskloop = main_task .taskloop , logfile = main_task .logfile )
1225
+
1226
+ self .exit_callback = self .handle_stage_exit
1227
+
1228
+
1229
+ def handle_stage_exit (self ):
1230
+ self .main_task .stages_running .remove (self )
1231
+
1232
+ # TODO pass the status back to the main task
0 commit comments