diff options
author | Clifford Wolf <clifford@clifford.at> | 2013-03-28 12:26:17 +0100 |
---|---|---|
committer | Clifford Wolf <clifford@clifford.at> | 2013-03-28 12:26:17 +0100 |
commit | 73fba5164ffce53c766cc82dc0825f23baf996d3 (patch) | |
tree | d437845c3ff88ecbc1a13c18fc6bbbe501678c01 /kernel | |
parent | b9870a364e35d8159a8bcc8c535a2aa971e78af9 (diff) | |
download | yosys-73fba5164ffce53c766cc82dc0825f23baf996d3.tar.gz yosys-73fba5164ffce53c766cc82dc0825f23baf996d3.tar.bz2 yosys-73fba5164ffce53c766cc82dc0825f23baf996d3.zip |
Implemented TCL support (only via -c option at the moment)
Diffstat (limited to 'kernel')
-rw-r--r-- | kernel/driver.cc | 48 | ||||
-rw-r--r-- | kernel/register.cc | 30 | ||||
-rw-r--r-- | kernel/register.h | 7 |
3 files changed, 78 insertions, 7 deletions
diff --git a/kernel/driver.cc b/kernel/driver.cc index 1dddefdcb..cdb9e9ecc 100644 --- a/kernel/driver.cc +++ b/kernel/driver.cc @@ -20,13 +20,13 @@ #include <stdio.h> #include <readline/readline.h> #include <readline/history.h> +#include <string.h> +#include <unistd.h> +#include <dlfcn.h> #include "kernel/rtlil.h" #include "kernel/register.h" #include "kernel/log.h" -#include <string.h> -#include <unistd.h> -#include <dlfcn.h> static void run_frontend(std::string filename, std::string command, RTLIL::Design *design, std::string *backend_command) { @@ -233,10 +233,15 @@ int main(int argc, char **argv) std::vector<void*> loaded_modules; std::string output_filename = ""; std::string scriptfile = ""; + bool scriptfile_tcl = false; bool got_output_filename = false; +#ifdef YOSYS_ENABLE_TCL + yosys_tcl = Tcl_CreateInterp(); +#endif + int opt; - while ((opt = getopt(argc, argv, "Sm:f:b:o:p:l:qts:")) != -1) + while ((opt = getopt(argc, argv, "Sm:f:b:o:p:l:qts:c:")) != -1) { switch (opt) { @@ -284,10 +289,15 @@ int main(int argc, char **argv) break; case 's': scriptfile = optarg; + scriptfile_tcl = false; + break; + case 'c': + scriptfile = optarg; + scriptfile_tcl = true; break; default: fprintf(stderr, "\n"); - fprintf(stderr, "Usage: %s [-S] [-q] [-t] [-l logfile] [-o <outfile>] [-f <frontend>] [-s <scriptfile>]\n", argv[0]); + fprintf(stderr, "Usage: %s [-S] [-q] [-t] [-l logfile] [-o <outfile>] [-f <frontend>] [{-s|-c} <scriptfile>]\n", argv[0]); fprintf(stderr, " %*s[-p <pass> [-p ..]] [-b <backend>] [-m <module_file>] [<infile> [..]]\n", int(strlen(argv[0])+1), ""); fprintf(stderr, "\n"); fprintf(stderr, " -q\n"); @@ -311,6 +321,9 @@ int main(int argc, char **argv) fprintf(stderr, " -s scriptfile\n"); fprintf(stderr, " execute the commands in the script file\n"); fprintf(stderr, "\n"); + fprintf(stderr, " -c tcl_scriptfile\n"); + fprintf(stderr, " execute the commands in the tcl script file\n"); + fprintf(stderr, "\n"); fprintf(stderr, " -p command\n"); fprintf(stderr, " execute the commands\n"); fprintf(stderr, "\n"); @@ -366,6 +379,10 @@ int main(int argc, char **argv) design->selection_stack.push_back(RTLIL::Selection()); log_push(); +#ifdef YOSYS_ENABLE_TCL + yosys_tcl_design = design; +#endif + if (optind == argc && passes_commands.size() == 0 && scriptfile.empty()) { if (!got_output_filename) backend_command = ""; @@ -375,8 +392,17 @@ int main(int argc, char **argv) while (optind < argc) run_frontend(argv[optind++], frontend_command, design, output_filename == "-" ? &backend_command : NULL); - if (!scriptfile.empty()) - run_frontend(scriptfile, "script", design, output_filename == "-" ? &backend_command : NULL); + if (!scriptfile.empty()) { + if (scriptfile_tcl) { +#ifdef YOSYS_ENABLE_TCL + if (Tcl_EvalFile(yosys_tcl, scriptfile.c_str()) != TCL_OK) + log_error("TCL interpreter returned an error: %s\n", Tcl_GetStringResult(yosys_tcl)); +#else + log_error("Can't exectue TCL script: this version of yosys is not built with TCL support enabled.\n"); +#endif + } else + run_frontend(scriptfile, "script", design, output_filename == "-" ? &backend_command : NULL); + } for (auto it = passes_commands.begin(); it != passes_commands.end(); it++) run_pass(*it, design); @@ -386,6 +412,10 @@ int main(int argc, char **argv) delete design; +#ifdef YOSYS_ENABLE_TCL + yosys_tcl_design = NULL; +#endif + log("\nREADY.\n"); log_pop(); @@ -400,6 +430,10 @@ int main(int argc, char **argv) for (auto mod : loaded_modules) dlclose(mod); +#ifdef YOSYS_ENABLE_TCL + Tcl_DeleteInterp(yosys_tcl); +#endif + return 0; } diff --git a/kernel/register.cc b/kernel/register.cc index 1dd608754..56222f733 100644 --- a/kernel/register.cc +++ b/kernel/register.cc @@ -27,6 +27,11 @@ using namespace REGISTER_INTERN; #define MAX_REG_COUNT 1000 +#ifdef YOSYS_ENABLE_TCL +Tcl_Interp *yosys_tcl = NULL; +RTLIL::Design *yosys_tcl_design = NULL; +#endif + namespace REGISTER_INTERN { int raw_register_count = 0; @@ -51,6 +56,8 @@ void Pass::run_register() { assert(pass_register.count(pass_name) == 0); pass_register[pass_name] = this; + + register_tcl(); } void Pass::init_register() @@ -70,6 +77,25 @@ void Pass::done_register() raw_register_done = false; } +#ifdef YOSYS_ENABLE_TCL +static int tcl_pass(ClientData that_vp, Tcl_Interp*, int argc, const char *argv[]) +{ + Pass *that = (Pass*)that_vp; + std::vector<std::string> args; + for (int i = 0; i < argc; i++) + args.push_back(argv[i]); + that->call(yosys_tcl_design, args); + return TCL_OK; +} +#endif + +void Pass::register_tcl() +{ +#ifdef YOSYS_ENABLE_TCL + Tcl_CreateCommand(yosys_tcl, pass_name.c_str(), tcl_pass, (ClientData)this, NULL); +#endif +} + Pass::~Pass() { } @@ -189,6 +215,8 @@ void Frontend::run_register() assert(frontend_register.count(frontend_name) == 0); frontend_register[frontend_name] = this; + + register_tcl(); } Frontend::~Frontend() @@ -281,6 +309,8 @@ void Backend::run_register() assert(backend_register.count(backend_name) == 0); backend_register[backend_name] = this; + + register_tcl(); } Backend::~Backend() diff --git a/kernel/register.h b/kernel/register.h index a817d8c64..4e3cc5c1e 100644 --- a/kernel/register.h +++ b/kernel/register.h @@ -26,6 +26,12 @@ #include <vector> #include <map> +#ifdef YOSYS_ENABLE_TCL +#include <tcl.h> +extern Tcl_Interp *yosys_tcl; +extern RTLIL::Design *yosys_tcl_design; +#endif + struct Pass { std::string pass_name, short_help; @@ -44,6 +50,7 @@ struct Pass static void init_register(); static void done_register(); + void register_tcl(); }; struct Frontend : Pass |