1919
2020#include " kernel/register.h"
2121#include " kernel/rtlil.h"
22+ #include " kernel/utils.h"
2223
2324USING_YOSYS_NAMESPACE
2425PRIVATE_NAMESPACE_BEGIN
2526
27+ std::vector<Module*> order_modules (Design *design, std::vector<Module *> modules)
28+ {
29+ std::set<Module *> modules_set (modules.begin (), modules.end ());
30+ TopoSort<Module*> sort;
31+
32+ for (auto m : modules) {
33+ sort.node (m);
34+
35+ for (auto cell : m->cells ()) {
36+ Module *submodule = design->module (cell->type );
37+ if (modules_set.count (submodule))
38+ sort.edge (submodule, m);
39+ }
40+ }
41+ log_assert (sort.sort ());
42+ return sort.sorted ;
43+ }
44+
2645struct AbcNewPass : public ScriptPass {
2746 AbcNewPass () : ScriptPass(" abc_new" , " (experimental) use ABC for SC technology mapping (new)" )
2847 {
@@ -101,6 +120,15 @@ struct AbcNewPass : public ScriptPass {
101120 }
102121
103122 if (check_label (" prep_boxes" )) {
123+ if (!help_mode) {
124+ for (auto mod : active_design->selected_whole_modules_warn ()) {
125+ if (mod->get_bool_attribute (ID::abc9_box)) {
126+ mod->set_bool_attribute (ID::abc9_box, false );
127+ mod->set_bool_attribute (ID (abc9_deferred_box), true );
128+ }
129+ }
130+ }
131+
104132 run (" box_derive" );
105133 run (" abc9_ops -prep_box" );
106134 }
@@ -109,7 +137,8 @@ struct AbcNewPass : public ScriptPass {
109137 std::vector<Module *> selected_modules;
110138
111139 if (!help_mode) {
112- selected_modules = active_design->selected_whole_modules_warn ();
140+ selected_modules = order_modules (active_design,
141+ active_design->selected_whole_modules_warn ());
113142 active_design->selection_stack .emplace_back (false );
114143 } else {
115144 selected_modules = {nullptr };
@@ -131,15 +160,36 @@ struct AbcNewPass : public ScriptPass {
131160 active_design->selection ().select (mod);
132161 }
133162
163+ std::string script_save;
164+ if (!help_mode && mod->has_attribute (ID (abc9_script))) {
165+ script_save = active_design->scratchpad_get_string (" abc9.script" );
166+ active_design->scratchpad_set_string (" abc9.script" ,
167+ mod->get_string_attribute (ID (abc9_script)));
168+ }
169+
134170 run (stringf (" abc9_ops -write_box %s/input.box" , tmpdir.c_str ()));
135171 run (stringf (" write_xaiger2 -mapping_prep -map2 %s/input.map2 %s/input.xaig" , tmpdir.c_str (), tmpdir.c_str ()));
136172 run (stringf (" abc9_exe %s -cwd %s -box %s/input.box" , exe_options.c_str (), tmpdir.c_str (), tmpdir.c_str ()));
137173 run (stringf (" read_xaiger2 -sc_mapping -module_name %s -map2 %s/input.map2 %s/output.aig" ,
138174 modname.c_str (), tmpdir.c_str (), tmpdir.c_str ()));
139175
176+ if (!help_mode && mod->has_attribute (ID (abc9_script))) {
177+ if (script_save.empty ())
178+ active_design->scratchpad_unset (" abc9.script" );
179+ else
180+ active_design->scratchpad_set_string (" abc9.script" , script_save);
181+ }
182+
140183 if (!help_mode) {
141184 active_design->selection ().selected_modules .clear ();
142185 log_pop ();
186+
187+ if (mod->get_bool_attribute (ID (abc9_deferred_box))) {
188+ mod->set_bool_attribute (ID (abc9_deferred_box), false );
189+ mod->set_bool_attribute (ID::abc9_box, true );
190+ Pass::call_on_module (active_design, mod, " portarcs -draw -write" );
191+ run (" abc9_ops -prep_box" );
192+ }
143193 }
144194 }
145195
0 commit comments