Support for reading liberty files using verific

This commit is contained in:
Miodrag Milanovic 2022-10-31 10:15:05 +01:00
parent 5f209f8be5
commit e702f2894a
2 changed files with 50 additions and 1 deletions

View File

@ -19,6 +19,7 @@ ENABLE_EDITLINE := 0
ENABLE_GHDL := 0 ENABLE_GHDL := 0
ENABLE_VERIFIC := 0 ENABLE_VERIFIC := 0
ENABLE_VERIFIC_EDIF := 0 ENABLE_VERIFIC_EDIF := 0
ENABLE_VERIFIC_LIBERTY := 0
DISABLE_VERIFIC_EXTENSIONS := 0 DISABLE_VERIFIC_EXTENSIONS := 0
DISABLE_VERIFIC_VHDL := 0 DISABLE_VERIFIC_VHDL := 0
ENABLE_COVER := 1 ENABLE_COVER := 1
@ -531,6 +532,10 @@ ifeq ($(ENABLE_VERIFIC_EDIF),1)
VERIFIC_COMPONENTS += edif VERIFIC_COMPONENTS += edif
CXXFLAGS += -DVERIFIC_EDIF_SUPPORT CXXFLAGS += -DVERIFIC_EDIF_SUPPORT
endif endif
ifeq ($(ENABLE_VERIFIC_LIBERTY),1)
VERIFIC_COMPONENTS += synlib
CXXFLAGS += -DVERIFIC_LIBERTY_SUPPORT
endif
ifneq ($(DISABLE_VERIFIC_EXTENSIONS),1) ifneq ($(DISABLE_VERIFIC_EXTENSIONS),1)
VERIFIC_COMPONENTS += extensions VERIFIC_COMPONENTS += extensions
CXXFLAGS += -DYOSYSHQ_VERIFIC_EXTENSIONS CXXFLAGS += -DYOSYSHQ_VERIFIC_EXTENSIONS

View File

@ -57,6 +57,10 @@ USING_YOSYS_NAMESPACE
#include "edif_file.h" #include "edif_file.h"
#endif #endif
#ifdef VERIFIC_LIBERTY_SUPPORT
#include "synlib_file.h"
#endif
#include "VerificStream.h" #include "VerificStream.h"
#include "FileSystem.h" #include "FileSystem.h"
@ -2358,6 +2362,9 @@ void verific_import(Design *design, const std::map<std::string,std::string> &par
#endif #endif
#ifdef VERIFIC_EDIF_SUPPORT #ifdef VERIFIC_EDIF_SUPPORT
edif_file::Reset(); edif_file::Reset();
#endif
#ifdef VERIFIC_LIBERTY_SUPPORT
synlib_file::Reset();
#endif #endif
Libset::Reset(); Libset::Reset();
Message::Reset(); Message::Reset();
@ -2426,6 +2433,13 @@ struct VerificPass : public Pass {
log("Load the specified EDIF files into Verific.\n"); log("Load the specified EDIF files into Verific.\n");
log("\n"); log("\n");
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("\n");
log("\n");
#endif #endif
log(" verific {-f|-F} [-vlog95|-vlog2k|-sv2005|-sv2009|\n"); log(" verific {-f|-F} [-vlog95|-vlog2k|-sv2005|-sv2009|\n");
log(" -sv2012|-sv|-formal] <command-file>\n"); log(" -sv2012|-sv|-formal] <command-file>\n");
@ -2535,7 +2549,7 @@ struct VerificPass : public Pass {
log("\n"); log("\n");
log(" -cells\n"); log(" -cells\n");
log(" Import all cell definitions from Verific loaded libraries even if they are\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("\n");
log(" -chparam name value \n"); log(" -chparam name value \n");
log(" Elaborate the specified top modules (all modules when -all given) using\n"); log(" Elaborate the specified top modules (all modules when -all given) using\n");
@ -2729,6 +2743,7 @@ struct VerificPass : public Pass {
int argidx = 1; int argidx = 1;
std::string work = "work"; std::string work = "work";
bool is_work_set = false;
veri_file::RegisterCallBackVerificStream(&verific_read_cb); veri_file::RegisterCallBackVerificStream(&verific_read_cb);
if (GetSize(args) > argidx && (args[argidx] == "-set-error" || args[argidx] == "-set-warning" || if (GetSize(args) > argidx && (args[argidx] == "-set-error" || args[argidx] == "-set-warning" ||
@ -2813,6 +2828,7 @@ struct VerificPass : public Pass {
{ {
if (args[argidx] == "-work" && argidx+1 < GetSize(args)) { if (args[argidx] == "-work" && argidx+1 < GetSize(args)) {
work = args[++argidx]; work = args[++argidx];
is_work_set = true;
continue; continue;
} }
if (args[argidx] == "-L" && argidx+1 < GetSize(args)) { if (args[argidx] == "-L" && argidx+1 < GetSize(args)) {
@ -3001,6 +3017,17 @@ struct VerificPass : public Pass {
} }
goto check_error; goto check_error;
} }
#endif
#ifdef VERIFIC_LIBERTY_SUPPORT
if (GetSize(args) > argidx && args[argidx] == "-liberty") {
argidx++;
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());
}
goto check_error;
}
#endif #endif
if (argidx < GetSize(args) && args[argidx] == "-pp") if (argidx < GetSize(args) && args[argidx] == "-pp")
{ {
@ -3293,6 +3320,9 @@ struct VerificPass : public Pass {
#endif #endif
#ifdef VERIFIC_EDIF_SUPPORT #ifdef VERIFIC_EDIF_SUPPORT
edif_file::Reset(); edif_file::Reset();
#endif
#ifdef VERIFIC_LIBERTY_SUPPORT
synlib_file::Reset();
#endif #endif
Libset::Reset(); Libset::Reset();
Message::Reset(); Message::Reset();
@ -3427,6 +3457,11 @@ struct ReadPass : public Pass {
log("\n"); log("\n");
log("\n"); log("\n");
#endif #endif
log(" read {-liberty} <liberty-file>..\n");
log("\n");
log("Load the specified Liberty files.\n");
log("\n");
log("\n");
log(" read {-f|-F} <command-file>\n"); log(" read {-f|-F} <command-file>\n");
log("\n"); log("\n");
log("Load and execute the specified command file. (Requires Verific.)\n"); log("Load and execute the specified command file. (Requires Verific.)\n");
@ -3531,6 +3566,15 @@ struct ReadPass : public Pass {
return; return;
} }
#endif #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 (args[1] == "-f" || args[1] == "-F") {
if (use_verific) { if (use_verific) {
args[0] = "verific"; args[0] = "verific";