Add BLIF parsing support for .conn and .cname
authorlitghost <537074+litghost@users.noreply.github.com>
Thu, 2 Aug 2018 21:33:39 +0000 (14:33 -0700)
committerlitghost <537074+litghost@users.noreply.github.com>
Thu, 2 Aug 2018 21:36:56 +0000 (14:36 -0700)
frontends/blif/blifparse.cc

index e6bb9995459e52d893ea8c7a8d3d01eefc3ab493..e2be61da8c67b68f0ec6a5e086ce78b9e723282c 100644 (file)
@@ -83,6 +83,7 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
        RTLIL::Module *module = nullptr;
        RTLIL::Const *lutptr = NULL;
        RTLIL::Cell *sopcell = NULL;
+       RTLIL::Cell *lastcell = nullptr;
        RTLIL::State lut_default_state = RTLIL::State::Sx;
        int blif_maxnum = 0, sopmode = -1;
 
@@ -159,6 +160,7 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
                                if (module != nullptr)
                                        goto error;
                                module = new RTLIL::Module;
+                               lastcell = nullptr;
                                module->name = RTLIL::escape_id(strtok(NULL, " \t\r\n"));
                                obj_attributes = &module->attributes;
                                obj_parameters = nullptr;
@@ -232,6 +234,7 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
                                }
 
                                module = nullptr;
+                               lastcell = nullptr;
                                obj_attributes = nullptr;
                                obj_parameters = nullptr;
                                continue;
@@ -264,6 +267,22 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
                                continue;
                        }
 
+                       if (!strcmp(cmd, ".cname"))
+                       {
+                               char *p = strtok(NULL, " \t\r\n");
+                               if (p == NULL)
+                                       goto error;
+
+                               if(lastcell == nullptr || module == nullptr)
+                               {
+                                       log_error("No primative object to attach .cname %s.\n", p);
+                                       goto error;
+                               }
+
+                               module->rename(lastcell, p);
+                               continue;
+                       }
+
                        if (!strcmp(cmd, ".attr") || !strcmp(cmd, ".param")) {
                                char *n = strtok(NULL, " \t\r\n");
                                char *v = strtok(NULL, "\r\n");
@@ -281,12 +300,16 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
                                                const_v.bits[i] = v[n-i-1] != '0' ? State::S1 : State::S0;
                                }
                                if (!strcmp(cmd, ".attr")) {
-                                       if (obj_attributes == nullptr)
+                                       if (obj_attributes == nullptr) {
+                                               log_error("No object to attach .attr too.\n");
                                                goto error;
+                                       }
                                        (*obj_attributes)[id_n] = const_v;
                                } else {
-                                       if (obj_parameters == nullptr)
+                                       if (obj_parameters == nullptr) {
+                                               log_error("No object to attach .param too.\n");
                                                goto error;
+                                       }
                                        (*obj_parameters)[id_n] = const_v;
                                }
                                continue;
@@ -331,6 +354,7 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
                                        }
                                }
 
+                               lastcell = cell;
                                obj_attributes = &cell->attributes;
                                obj_parameters = &cell->parameters;
                                continue;
@@ -383,6 +407,7 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
                                        cell->setPort(it.first, sig);
                                }
 
+                               lastcell = cell;
                                obj_attributes = &cell->attributes;
                                obj_parameters = &cell->parameters;
                                continue;
@@ -391,7 +416,7 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
                        obj_attributes = nullptr;
                        obj_parameters = nullptr;
 
-                       if (!strcmp(cmd, ".barbuf"))
+                       if (!strcmp(cmd, ".barbuf") || !strcmp(cmd, ".conn"))
                        {
                                char *p = strtok(NULL, " \t\r\n");
                                if (p == NULL)
@@ -459,6 +484,7 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
                                        sopcell->setPort("\\A", input_sig);
                                        sopcell->setPort("\\Y", output_sig);
                                        sopmode = -1;
+                                       lastcell = sopcell;
                                }
                                else
                                {
@@ -469,6 +495,7 @@ void parse_blif(RTLIL::Design *design, std::istream &f, std::string dff_name, bo
                                        cell->setPort("\\Y", output_sig);
                                        lutptr = &cell->parameters.at("\\LUT");
                                        lut_default_state = RTLIL::State::Sx;
+                                       lastcell = cell;
                                }
                                continue;
                        }