aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Makefile5
-rw-r--r--frontends/verific/verific.cc80
2 files changed, 84 insertions, 1 deletions
diff --git a/Makefile b/Makefile
index 78526d5ef..02afebe2e 100644
--- a/Makefile
+++ b/Makefile
@@ -19,6 +19,7 @@ ENABLE_EDITLINE := 0
ENABLE_GHDL := 0
ENABLE_VERIFIC := 0
ENABLE_VERIFIC_EDIF := 0
+ENABLE_VERIFIC_LIBERTY := 0
DISABLE_VERIFIC_EXTENSIONS := 0
DISABLE_VERIFIC_VHDL := 0
ENABLE_COVER := 1
@@ -544,6 +545,10 @@ ifeq ($(ENABLE_VERIFIC_EDIF),1)
VERIFIC_COMPONENTS += edif
CXXFLAGS += -DVERIFIC_EDIF_SUPPORT
endif
+ifeq ($(ENABLE_VERIFIC_LIBERTY),1)
+VERIFIC_COMPONENTS += synlib
+CXXFLAGS += -DVERIFIC_LIBERTY_SUPPORT
+endif
ifneq ($(DISABLE_VERIFIC_EXTENSIONS),1)
VERIFIC_COMPONENTS += extensions
CXXFLAGS += -DYOSYSHQ_VERIFIC_EXTENSIONS
diff --git a/frontends/verific/verific.cc b/frontends/verific/verific.cc
index 71b87755d..6ef563929 100644
--- a/frontends/verific/verific.cc
+++ b/frontends/verific/verific.cc
@@ -57,6 +57,11 @@ USING_YOSYS_NAMESPACE
#include "edif_file.h"
#endif
+#ifdef VERIFIC_LIBERTY_SUPPORT
+#include "synlib_file.h"
+#include "SynlibGroup.h"
+#endif
+
#include "VerificStream.h"
#include "FileSystem.h"
@@ -2359,6 +2364,9 @@ void verific_import(Design *design, const std::map<std::string,std::string> &par
#ifdef VERIFIC_EDIF_SUPPORT
edif_file::Reset();
#endif
+#ifdef VERIFIC_LIBERTY_SUPPORT
+ synlib_file::Reset();
+#endif
Libset::Reset();
Message::Reset();
RuntimeFlags::DeleteAllFlags();
@@ -2427,6 +2435,18 @@ struct VerificPass : public Pass {
log("\n");
log("\n");
#endif
+#ifdef VERIFIC_LIBERTY_SUPPORT
+ log(" verific {-liberty} <liberty-file>..\n");
+ log("\n");
+ log("Load the specified Liberty files into Verific.\n");
+ log("Default library when -work is not present is one specified in liberty file.\n");
+ log("To use from SystemVerilog or VHDL use -L to specify liberty library.");
+ log("\n");
+ log(" -lib\n");
+ log(" only create empty blackbox modules\n");
+ log("\n");
+ log("\n");
+#endif
log(" verific {-f|-F} [-vlog95|-vlog2k|-sv2005|-sv2009|\n");
log(" -sv2012|-sv|-formal] <command-file>\n");
log("\n");
@@ -2535,7 +2555,7 @@ struct VerificPass : public Pass {
log("\n");
log(" -cells\n");
log(" Import all cell definitions from Verific loaded libraries even if they are\n");
- log(" unused in design. Useful with \"-edif\" option.\n");
+ log(" unused in design. Useful with \"-edif\" and \"-liberty\" option.\n");
log("\n");
log(" -chparam name value \n");
log(" Elaborate the specified top modules (all modules when -all given) using\n");
@@ -2729,6 +2749,7 @@ struct VerificPass : public Pass {
int argidx = 1;
std::string work = "work";
+ bool is_work_set = false;
veri_file::RegisterCallBackVerificStream(&verific_read_cb);
if (GetSize(args) > argidx && (args[argidx] == "-set-error" || args[argidx] == "-set-warning" ||
@@ -2813,6 +2834,7 @@ struct VerificPass : public Pass {
{
if (args[argidx] == "-work" && argidx+1 < GetSize(args)) {
work = args[++argidx];
+ is_work_set = true;
continue;
}
if (args[argidx] == "-L" && argidx+1 < GetSize(args)) {
@@ -3002,6 +3024,42 @@ struct VerificPass : public Pass {
goto check_error;
}
#endif
+#ifdef VERIFIC_LIBERTY_SUPPORT
+ if (GetSize(args) > argidx && args[argidx] == "-liberty") {
+ bool flag_lib = false;
+ for (argidx++; argidx < GetSize(args); argidx++) {
+ if (args[argidx] == "-lib") {
+ flag_lib = true;
+ continue;
+ }
+ if (args[argidx].compare(0, 1, "-") == 0) {
+ cmd_error(args, argidx, "unknown option");
+ goto check_error;
+ }
+ break;
+ }
+
+ while (argidx < GetSize(args)) {
+ std::string filename = frontent_rewrite(args, argidx, tmp_files);
+ if (!synlib_file::Read(filename.c_str(), is_work_set ? work.c_str() : nullptr))
+ log_cmd_error("Reading `%s' in LIBERTY mode failed.\n", filename.c_str());
+ SynlibLibrary *lib = synlib_file::GetLastLibraryAnalyzed();
+ if (lib && flag_lib) {
+ MapIter mi ;
+ Verific::Cell *c ;
+ FOREACH_CELL_OF_LIBRARY(lib->GetLibrary(),mi,c) {
+ MapIter ni ;
+ Netlist *nl;
+ FOREACH_NETLIST_OF_CELL(c, ni, nl) {
+ if (nl)
+ nl->MakeBlackBox();
+ }
+ }
+ }
+ }
+ goto check_error;
+ }
+#endif
if (argidx < GetSize(args) && args[argidx] == "-pp")
{
const char* filename = nullptr;
@@ -3294,6 +3352,9 @@ struct VerificPass : public Pass {
#ifdef VERIFIC_EDIF_SUPPORT
edif_file::Reset();
#endif
+#ifdef VERIFIC_LIBERTY_SUPPORT
+ synlib_file::Reset();
+#endif
Libset::Reset();
Message::Reset();
RuntimeFlags::DeleteAllFlags();
@@ -3427,6 +3488,14 @@ struct ReadPass : public Pass {
log("\n");
log("\n");
#endif
+ log(" read {-liberty} <liberty-file>..\n");
+ log("\n");
+ log("Load the specified Liberty files.\n");
+ log("\n");
+ log(" -lib\n");
+ log(" only create empty blackbox modules\n");
+ log("\n");
+ log("\n");
log(" read {-f|-F} <command-file>\n");
log("\n");
log("Load and execute the specified command file. (Requires Verific.)\n");
@@ -3531,6 +3600,15 @@ struct ReadPass : public Pass {
return;
}
#endif
+ if (args[1] == "-liberty") {
+ if (use_verific) {
+ args[0] = "verific";
+ } else {
+ args[0] = "read_liberty";
+ }
+ Pass::call(design, args);
+ return;
+ }
if (args[1] == "-f" || args[1] == "-F") {
if (use_verific) {
args[0] = "verific";