write_xaiger: fix for (* keep *) on flop output
authorEddie Hung <eddie@fpgeh.com>
Tue, 21 Jan 2020 17:43:04 +0000 (09:43 -0800)
committerEddie Hung <eddie@fpgeh.com>
Tue, 21 Jan 2020 17:43:04 +0000 (09:43 -0800)
backends/aiger/xaiger.cc
tests/various/abc9.ys

index a9b75ecc7b14eee8a16fb4eb16a022b9250f09c7..b72dd689094ee5b83a0ac2ca211f4873fe8b84ed 100644 (file)
@@ -222,6 +222,8 @@ struct XAigerWriter
                                        alias_map[Q] = D;
                                        auto r YS_ATTRIBUTE(unused) = ff_bits.insert(std::make_pair(D, cell));
                                        log_assert(r.second);
+                                       if (input_bits.erase(Q))
+                                               log_assert(Q.wire->attributes.count(ID::keep));
                                        continue;
                                }
 
@@ -568,9 +570,6 @@ struct XAigerWriter
                //      write_o_buffer(0);
 
                if (!box_list.empty() || !ff_bits.empty()) {
-                       RTLIL::Module *holes_module = module->design->module(stringf("%s$holes", module->name.c_str()));
-                       log_assert(holes_module);
-
                        dict<IdString, std::tuple<int,int,int>> cell_cache;
 
                        int box_count = 0;
@@ -653,6 +652,7 @@ struct XAigerWriter
                        f.write(reinterpret_cast<const char*>(&buffer_size_be), sizeof(buffer_size_be));
                        f.write(buffer_str.data(), buffer_str.size());
 
+                       RTLIL::Module *holes_module = module->design->module(stringf("%s$holes", module->name.c_str()));
                        if (holes_module) {
                                std::stringstream a_buffer;
                                XAigerWriter writer(holes_module, true /* holes_mode */);
index 81d0afd1ba0461917576799686e5df4150242d21..0c76950894cbdbd2f82c82fb5efac15b426df4bb 100644 (file)
@@ -14,6 +14,7 @@ design -import gate -as gate
 miter -equiv -flatten -make_assert -make_outputs gold gate miter
 sat -verify -prove-asserts -show-ports miter
 
+
 design -load read
 hierarchy -top abc9_test028
 proc
@@ -23,6 +24,7 @@ select -assert-count 1 t:$lut r:LUT=2'b01 r:WIDTH=1 %i %i
 select -assert-count 1 t:unknown
 select -assert-none t:$lut t:unknown %% t: %D
 
+
 design -load read
 hierarchy -top abc9_test032
 proc
@@ -38,3 +40,16 @@ design -import gate -as gate
 
 miter -equiv -flatten -make_assert -make_outputs gold gate miter
 sat -seq 10 -verify -prove-asserts -show-ports miter
+
+
+design -reset
+read_verilog -icells <<EOT
+module abc9_test036(input clk, d, output q);
+(* keep *) reg w;
+$__ABC9_FF_ ff(.D(d), .Q(w));
+wire \ff.clock = clk;
+wire \ff.init = 1'b0;
+assign q = w;
+endmodule
+EOT
+abc9 -lut 4 -dff