firrtl: Accept techmapped cell types in FIRRTL backend.
authorAlberto Gonzalez <boqwxp@airmail.cc>
Sun, 17 May 2020 08:44:31 +0000 (08:44 +0000)
committerAlberto Gonzalez <boqwxp@airmail.cc>
Sun, 17 May 2020 10:03:11 +0000 (10:03 +0000)
backends/firrtl/firrtl.cc

index f6dae1d8cf84bb332a5653131a60e5a127b34b47..89df0366fa4d1f09da25f1c4fa5b55b3b570fa50 100644 (file)
@@ -446,7 +446,7 @@ struct FirrtlWorker
                        string y_id = make_id(cell->name);
                        std::string cellFileinfo = getFileinfo(cell);
 
-                       if (cell->type.in(ID($not), ID($logic_not), ID($neg), ID($reduce_and), ID($reduce_or), ID($reduce_xor), ID($reduce_bool), ID($reduce_xnor)))
+                       if (cell->type.in(ID($not), ID($logic_not), ID($_NOT_), ID($neg), ID($reduce_and), ID($reduce_or), ID($reduce_xor), ID($reduce_bool), ID($reduce_xnor)))
                        {
                                string a_expr = make_expr(cell->getPort(ID::A));
                                wire_decls.push_back(stringf("    wire %s: UInt<%d> %s\n", y_id.c_str(), y_width, cellFileinfo.c_str()));
@@ -462,7 +462,7 @@ struct FirrtlWorker
 
                                // Assume the FIRRTL width is a single bit.
                                firrtl_width = 1;
-                               if (cell->type == ID($not)) primop = "not";
+                               if (cell->type.in(ID($not), ID($_NOT_))) primop = "not";
                                else if (cell->type == ID($neg)) {
                                        primop = "neg";
                                        firrtl_is_signed = true;        // Result of "neg" is signed (an SInt).
@@ -494,7 +494,7 @@ struct FirrtlWorker
 
                                continue;
                        }
-                       if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($xor), ID($xnor), ID($and), ID($or), ID($eq), ID($eqx),
+                       if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($xor), ID($_XOR_), ID($xnor), ID($and), ID($_AND_), ID($or), ID($_OR_), ID($eq), ID($eqx),
                                         ID($gt), ID($ge), ID($lt), ID($le), ID($ne), ID($nex), ID($shr), ID($sshr), ID($sshl), ID($shl),
                                         ID($logic_and), ID($logic_or), ID($pow)))
                        {
@@ -524,7 +524,7 @@ struct FirrtlWorker
 
                                // For the arithmetic ops, expand operand widths to result widths befor performing the operation.
                                // This corresponds (according to iverilog) to what verilog compilers implement.
-                               if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($xor), ID($xnor), ID($and), ID($or)))
+                               if (cell->type.in(ID($add), ID($sub), ID($mul), ID($div), ID($mod), ID($xor), ID($_XOR_), ID($xnor), ID($and), ID($_AND_), ID($or), ID($_OR_)))
                                {
                                        if (a_width < y_width) {
                                                a_expr = stringf("pad(%s, %d)", a_expr.c_str(), y_width);
@@ -560,17 +560,17 @@ struct FirrtlWorker
                                } else if (cell->type == ID($mod)) {
                                        primop = "rem";
                                        firrtl_width = min(a_width, b_width);
-                               } else if (cell->type == ID($and)) {
+                               } else if (cell->type.in(ID($and), ID($_AND_))) {
                                        primop = "and";
                                        always_uint = true;
                                        firrtl_width = max(a_width, b_width);
                                }
-                               else if (cell->type == ID($or) ) {
+                               else if (cell->type.in(ID($or), ID($_OR_))) {
                                        primop =  "or";
                                        always_uint = true;
                                        firrtl_width = max(a_width, b_width);
                                }
-                               else if (cell->type == ID($xor)) {
+                               else if (cell->type.in(ID($xor), ID($_XOR_))) {
                                        primop = "xor";
                                        always_uint = true;
                                        firrtl_width = max(a_width, b_width);
@@ -694,7 +694,8 @@ struct FirrtlWorker
                                        }
                                }
 
-                               if (!cell->parameters.at(ID::B_SIGNED).as_bool()) {
+                               auto it = cell->parameters.find(ID::B_SIGNED);
+                               if (it == cell->parameters.end() || !it->second.as_bool()) {
                                        b_expr = "asUInt(" + b_expr + ")";
                                }
 
@@ -723,9 +724,10 @@ struct FirrtlWorker
                                continue;
                        }
 
-                       if (cell->type.in(ID($mux)))
+                       if (cell->type.in(ID($mux), ID($_MUX_)))
                        {
-                               int width = cell->parameters.at(ID::WIDTH).as_int();
+                               auto it = cell->parameters.find(ID::WIDTH);
+                               int width = it == cell->parameters.end()? 1 : it->second.as_int();
                                string a_expr = make_expr(cell->getPort(ID::A));
                                string b_expr = make_expr(cell->getPort(ID::B));
                                string s_expr = make_expr(cell->getPort(ID::S));