From fad0b0c506f2d7cb1158a3dac53139b8dec7a04e Mon Sep 17 00:00:00 2001 From: William Speirs Date: Tue, 14 Oct 2014 17:06:02 -0400 Subject: [PATCH 01/11] Updated lexers & parsers to include prefixes --- frontends/ilang/Makefile.inc | 22 ++++++++--------- frontends/ilang/{lexer.l => ilang_lexer.l} | 8 +++++-- frontends/ilang/{parser.y => ilang_parser.y} | 0 frontends/verilog/Makefile.inc | 24 +++++++++---------- .../verilog/{lexer.l => verilog_lexer.l} | 8 +++++-- .../verilog/{parser.y => verilog_parser.y} | 0 6 files changed, 35 insertions(+), 27 deletions(-) rename frontends/ilang/{lexer.l => ilang_lexer.l} (95%) rename frontends/ilang/{parser.y => ilang_parser.y} (100%) rename frontends/verilog/{lexer.l => verilog_lexer.l} (98%) rename frontends/verilog/{parser.y => verilog_parser.y} (100%) diff --git a/frontends/ilang/Makefile.inc b/frontends/ilang/Makefile.inc index e832cfed8..984d436c6 100644 --- a/frontends/ilang/Makefile.inc +++ b/frontends/ilang/Makefile.inc @@ -1,18 +1,18 @@ -GENFILES += frontends/ilang/parser.tab.cc -GENFILES += frontends/ilang/parser.tab.h -GENFILES += frontends/ilang/parser.output -GENFILES += frontends/ilang/lexer.cc +GENFILES += frontends/ilang/ilang_parser.tab.cc +GENFILES += frontends/ilang/ilang_parser.tab.h +GENFILES += frontends/ilang/ilang_parser.output +GENFILES += frontends/ilang/ilang_lexer.cc -frontends/ilang/parser.tab.cc: frontends/ilang/parser.y - $(P) bison -d -r all -b frontends/ilang/parser frontends/ilang/parser.y - $(Q) mv frontends/ilang/parser.tab.c frontends/ilang/parser.tab.cc +frontends/ilang/ilang_parser.tab.cc: frontends/ilang/ilang_parser.y + $(P) bison -d -r all -b frontends/ilang/ilang_parser frontends/ilang/ilang_parser.y + $(Q) mv frontends/ilang/ilang_parser.tab.c frontends/ilang/ilang_parser.tab.cc -frontends/ilang/parser.tab.h: frontends/ilang/parser.tab.cc +frontends/ilang/ilang_parser.tab.h: frontends/ilang/ilang_parser.tab.cc -frontends/ilang/lexer.cc: frontends/ilang/lexer.l - $(P) flex -o frontends/ilang/lexer.cc frontends/ilang/lexer.l +frontends/ilang/ilang_lexer.cc: frontends/ilang/ilang_lexer.l + $(P) flex -o frontends/ilang/ilang_lexer.cc frontends/ilang/ilang_lexer.l -OBJS += frontends/ilang/parser.tab.o frontends/ilang/lexer.o +OBJS += frontends/ilang/ilang_parser.tab.o frontends/ilang/ilang_lexer.o OBJS += frontends/ilang/ilang_frontend.o diff --git a/frontends/ilang/lexer.l b/frontends/ilang/ilang_lexer.l similarity index 95% rename from frontends/ilang/lexer.l rename to frontends/ilang/ilang_lexer.l index 9669f0924..dcbc6b6d7 100644 --- a/frontends/ilang/lexer.l +++ b/frontends/ilang/ilang_lexer.l @@ -30,12 +30,16 @@ #endif #include "ilang_frontend.h" -#include "parser.tab.h" +#include "ilang_parser.tab.h" USING_YOSYS_NAMESPACE #define YY_INPUT(buf,result,max_size) \ - result = readsome(*ILANG_FRONTEND::lexin, buf, max_size); + do { \ + ILANG_FRONTEND::lexin->read(buf, max_size-1); \ + result = ILANG_FRONTEND::lexin->gcount(); \ + if (result >= 0) buf[result] = '\0'; \ + } while (0) %} diff --git a/frontends/ilang/parser.y b/frontends/ilang/ilang_parser.y similarity index 100% rename from frontends/ilang/parser.y rename to frontends/ilang/ilang_parser.y diff --git a/frontends/verilog/Makefile.inc b/frontends/verilog/Makefile.inc index 49eb320ec..1b6854bb5 100644 --- a/frontends/verilog/Makefile.inc +++ b/frontends/verilog/Makefile.inc @@ -1,20 +1,20 @@ -GENFILES += frontends/verilog/parser.tab.cc -GENFILES += frontends/verilog/parser.tab.h -GENFILES += frontends/verilog/parser.output -GENFILES += frontends/verilog/lexer.cc +GENFILES += frontends/verilog/verilog_parser.tab.cc +GENFILES += frontends/verilog/verilog_parser.tab.h +GENFILES += frontends/verilog/verilog_parser.output +GENFILES += frontends/verilog/verilog_lexer.cc -frontends/verilog/parser.tab.cc: frontends/verilog/parser.y - $(P) bison -d -r all -b frontends/verilog/parser frontends/verilog/parser.y - $(Q) mv frontends/verilog/parser.tab.c frontends/verilog/parser.tab.cc +frontends/verilog/verilog_parser.tab.cc: frontends/verilog/verilog_parser.y + $(P) bison -d -r all -b frontends/verilog/verilog_parser frontends/verilog/verilog_parser.y + $(Q) mv frontends/verilog/verilog_parser.tab.c frontends/verilog/verilog_parser.tab.cc -frontends/verilog/parser.tab.h: frontends/verilog/parser.tab.cc +frontends/verilog/verilog_parser.tab.h: frontends/verilog/verilog_parser.tab.cc -frontends/verilog/lexer.cc: frontends/verilog/lexer.l - $(P) flex -o frontends/verilog/lexer.cc frontends/verilog/lexer.l +frontends/verilog/verilog_lexer.cc: frontends/verilog/verilog_lexer.l + $(P) flex -o frontends/verilog/verilog_lexer.cc frontends/verilog/verilog_lexer.l -OBJS += frontends/verilog/parser.tab.o -OBJS += frontends/verilog/lexer.o +OBJS += frontends/verilog/verilog_parser.tab.o +OBJS += frontends/verilog/verilog_lexer.o OBJS += frontends/verilog/preproc.o OBJS += frontends/verilog/verilog_frontend.o OBJS += frontends/verilog/const2ast.o diff --git a/frontends/verilog/lexer.l b/frontends/verilog/verilog_lexer.l similarity index 98% rename from frontends/verilog/lexer.l rename to frontends/verilog/verilog_lexer.l index 98f360885..0d28e2e7f 100644 --- a/frontends/verilog/lexer.l +++ b/frontends/verilog/verilog_lexer.l @@ -42,7 +42,7 @@ #include "kernel/log.h" #include "verilog_frontend.h" #include "frontends/ast/ast.h" -#include "parser.tab.h" +#include "verilog_parser.tab.h" USING_YOSYS_NAMESPACE using namespace AST; @@ -64,7 +64,11 @@ YOSYS_NAMESPACE_END return TOK_ID; #define YY_INPUT(buf,result,max_size) \ - result = readsome(*lexin, buf, max_size); + do { \ + lexin->read(buf, max_size-1); \ + result = lexin->gcount(); \ + if (result >= 0) buf[result] = '\0'; \ + } while (0) %} diff --git a/frontends/verilog/parser.y b/frontends/verilog/verilog_parser.y similarity index 100% rename from frontends/verilog/parser.y rename to frontends/verilog/verilog_parser.y From 0352dbfd65072f42824852b2f5b925e7d9865a90 Mon Sep 17 00:00:00 2001 From: William Speirs Date: Tue, 14 Oct 2014 17:07:30 -0400 Subject: [PATCH 02/11] Fixed log so it will compile under Visual Studio - Included an implementation of gettimeofday --- kernel/log.cc | 25 ++++++++++++++++++++++++- kernel/log.h | 22 +++++++++++++++------- 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/kernel/log.cc b/kernel/log.cc index 87a75410d..4585e7eff 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -21,7 +21,10 @@ #include "libs/sha1/sha1.h" #include "backends/ilang/ilang_backend.h" -#include +#ifndef _WIN32 + #include +#endif + #include #include #include @@ -48,6 +51,26 @@ static struct timeval initial_tv = { 0, 0 }; static bool next_print_log = false; static int log_newline_count = 0; +#ifdef _WIN32 +// this will get time information and return it in timeval, simulating gettimeofday() +int gettimeofday(struct timeval *tv, struct timezone *tz) +{ + LARGE_INTEGER counter; + LARGE_INTEGER freq; + + QueryPerformanceFrequency(&freq); + QueryPerformanceCounter(&counter); + + counter.QuadPart *= 1000000; + counter.QuadPart /= freq.QuadPart; + + tv->tv_sec = counter.QuadPart / 1000000; + tv->tv_usec = counter.QuadPart % 1000000; + + return 0; +} +#endif + void logv(const char *format, va_list ap) { while (format[0] == '\n' && format[1] != 0) { diff --git a/kernel/log.h b/kernel/log.h index b4182b5f3..d4b21110c 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -23,10 +23,10 @@ #define LOG_H #include -#include #ifndef _WIN32 -# include + #include + #include #endif // from libs/sha1/sha1.h @@ -51,12 +51,20 @@ extern int log_verbose_level; void logv(const char *format, va_list ap); void logv_header(const char *format, va_list ap); -void logv_error(const char *format, va_list ap) __attribute__ ((noreturn)); -void log(const char *format, ...) __attribute__ ((format (printf, 1, 2))); -void log_header(const char *format, ...) __attribute__ ((format (printf, 1, 2))); -void log_error(const char *format, ...) __attribute__ ((format (printf, 1, 2))) __attribute__ ((noreturn)); -void log_cmd_error(const char *format, ...) __attribute__ ((format (printf, 1, 2))) __attribute__ ((noreturn)); +#if !defined(__GNUC__) && !defined(__clang__) + void logv_error(const char *format, va_list ap); + void log(const char *format, ...); + void log_header(const char *format, ...); + void log_error(const char *format, ...); + void log_cmd_error(const char *format, ...); +#else + void logv_error(const char *format, va_list ap) __attribute__((noreturn)); + void log(const char *format, ...) __attribute__((format(printf, 1, 2))); + void log_header(const char *format, ...) __attribute__((format(printf, 1, 2))); + void log_error(const char *format, ...) __attribute__((format(printf, 1, 2))) __attribute__((noreturn)); + void log_cmd_error(const char *format, ...) __attribute__((format(printf, 1, 2))) __attribute__((noreturn)); +#endif void log_spacer(); void log_push(); From 069521e2d5d5568739c7e8d7db31859bb88965a6 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Wed, 15 Oct 2014 00:56:04 +0200 Subject: [PATCH 03/11] Define empty __attribute__ macro for non-gcc, non-clang compilers --- kernel/log.h | 18 +++++------------- kernel/yosys.h | 4 ++++ 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/kernel/log.h b/kernel/log.h index d4b21110c..e0c8f7ba0 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -52,19 +52,11 @@ extern int log_verbose_level; void logv(const char *format, va_list ap); void logv_header(const char *format, va_list ap); -#if !defined(__GNUC__) && !defined(__clang__) - void logv_error(const char *format, va_list ap); - void log(const char *format, ...); - void log_header(const char *format, ...); - void log_error(const char *format, ...); - void log_cmd_error(const char *format, ...); -#else - void logv_error(const char *format, va_list ap) __attribute__((noreturn)); - void log(const char *format, ...) __attribute__((format(printf, 1, 2))); - void log_header(const char *format, ...) __attribute__((format(printf, 1, 2))); - void log_error(const char *format, ...) __attribute__((format(printf, 1, 2))) __attribute__((noreturn)); - void log_cmd_error(const char *format, ...) __attribute__((format(printf, 1, 2))) __attribute__((noreturn)); -#endif +void logv_error(const char *format, va_list ap) __attribute__((noreturn)); +void log(const char *format, ...) __attribute__((format(printf, 1, 2))); +void log_header(const char *format, ...) __attribute__((format(printf, 1, 2))); +void log_error(const char *format, ...) __attribute__((format(printf, 1, 2))) __attribute__((noreturn)); +void log_cmd_error(const char *format, ...) __attribute__((format(printf, 1, 2))) __attribute__((noreturn)); void log_spacer(); void log_push(); diff --git a/kernel/yosys.h b/kernel/yosys.h index 5a37dd3c5..37d3e52f4 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -77,6 +77,10 @@ # define FINAL #endif +#if !defined(__GNUC__) && !defined(__clang__) +# define __attribute__(...) +#endif + YOSYS_NAMESPACE_BEGIN namespace RTLIL { From 9cb230379901da89649676d4a2752bde59c09f59 Mon Sep 17 00:00:00 2001 From: William Speirs Date: Tue, 14 Oct 2014 17:10:08 -0400 Subject: [PATCH 04/11] Made iterators extend std::iterator and added == operator --- kernel/rtlil.h | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/kernel/rtlil.h b/kernel/rtlil.h index 8df0bfe19..5629c8652 100644 --- a/kernel/rtlil.h +++ b/kernel/rtlil.h @@ -920,23 +920,25 @@ struct RTLIL::SigBit } }; -struct RTLIL::SigSpecIterator +struct RTLIL::SigSpecIterator : public std::iterator { RTLIL::SigSpec *sig_p; int index; inline RTLIL::SigBit &operator*() const; inline bool operator!=(const RTLIL::SigSpecIterator &other) const { return index != other.index; } + inline bool operator==(const RTLIL::SigSpecIterator &other) const { return index == other.index; } inline void operator++() { index++; } }; -struct RTLIL::SigSpecConstIterator +struct RTLIL::SigSpecConstIterator : public std::iterator { const RTLIL::SigSpec *sig_p; int index; inline const RTLIL::SigBit &operator*() const; inline bool operator!=(const RTLIL::SigSpecConstIterator &other) const { return index != other.index; } + inline bool operator==(const RTLIL::SigSpecIterator &other) const { return index == other.index; } inline void operator++() { index++; } }; From 6433203b39f830a5c0d80347f14ab341ef3921ce Mon Sep 17 00:00:00 2001 From: William Speirs Date: Tue, 14 Oct 2014 17:10:53 -0400 Subject: [PATCH 05/11] Wrapped init in std::set constructor --- passes/opt/wreduce.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/passes/opt/wreduce.cc b/passes/opt/wreduce.cc index 89b1f8856..8f59a041e 100644 --- a/passes/opt/wreduce.cc +++ b/passes/opt/wreduce.cc @@ -32,14 +32,14 @@ struct WreduceConfig WreduceConfig() { - supported_cell_types = { + supported_cell_types = std::set({ "$not", "$pos", "$neg", "$and", "$or", "$xor", "$xnor", "$shl", "$shr", "$sshl", "$sshr", "$shift", "$shiftx", "$lt", "$le", "$eq", "$ne", "$eqx", "$nex", "$ge", "$gt", "$add", "$sub", // "$mul", "$div", "$mod", "$pow", "$mux", "$pmux" - }; + }); } }; From 9ee3a4b94fa78ad2ccf4178d7a49bc659df29cb1 Mon Sep 17 00:00:00 2001 From: William Speirs Date: Tue, 14 Oct 2014 17:15:08 -0400 Subject: [PATCH 06/11] Changed to explicit heap allocated memory --- libs/sha1/sha1.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/libs/sha1/sha1.cpp b/libs/sha1/sha1.cpp index dc86b2ce2..825274b9b 100644 --- a/libs/sha1/sha1.cpp +++ b/libs/sha1/sha1.cpp @@ -256,9 +256,12 @@ void SHA1::buffer_to_block(const std::string &buffer, uint32 block[BLOCK_BYTES]) void SHA1::read(std::istream &is, std::string &s, int max) { - char sbuf[max]; + char* sbuf = new char[max]; + is.read(sbuf, max); s.assign(sbuf, is.gcount()); + + delete[] sbuf; } From e5b8390f44be7d300fdf32193fa58b76ba448072 Mon Sep 17 00:00:00 2001 From: William Speirs Date: Tue, 14 Oct 2014 17:15:35 -0400 Subject: [PATCH 07/11] Changed from "and" to "&&" --- passes/fsm/fsm_opt.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/passes/fsm/fsm_opt.cc b/passes/fsm/fsm_opt.cc index 6685e8e0e..4b93d79f9 100644 --- a/passes/fsm/fsm_opt.cc +++ b/passes/fsm/fsm_opt.cc @@ -342,7 +342,7 @@ struct FsmOptPass : public Pass { for (auto &mod_it : design->modules_) { if (design->selected(mod_it.second)) for (auto &cell_it : mod_it.second->cells_) - if (cell_it.second->type == "$fsm" and design->selected(mod_it.second, cell_it.second)) + if (cell_it.second->type == "$fsm" && design->selected(mod_it.second, cell_it.second)) FsmData::optimize_fsm(cell_it.second, mod_it.second); } } From cf85aab62f961c905e4691fde59af774053d3d58 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Wed, 15 Oct 2014 01:05:08 +0200 Subject: [PATCH 08/11] A few indent fixes --- kernel/log.cc | 2 +- kernel/log.h | 4 ++-- libs/sha1/sha1.cpp | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/kernel/log.cc b/kernel/log.cc index 4585e7eff..2cae6a636 100644 --- a/kernel/log.cc +++ b/kernel/log.cc @@ -22,7 +22,7 @@ #include "backends/ilang/ilang_backend.h" #ifndef _WIN32 - #include +# include #endif #include diff --git a/kernel/log.h b/kernel/log.h index e0c8f7ba0..904ba4759 100644 --- a/kernel/log.h +++ b/kernel/log.h @@ -25,8 +25,8 @@ #include #ifndef _WIN32 - #include - #include +# include +# include #endif // from libs/sha1/sha1.h diff --git a/libs/sha1/sha1.cpp b/libs/sha1/sha1.cpp index 825274b9b..883d42837 100644 --- a/libs/sha1/sha1.cpp +++ b/libs/sha1/sha1.cpp @@ -261,7 +261,7 @@ void SHA1::read(std::istream &is, std::string &s, int max) is.read(sbuf, max); s.assign(sbuf, is.gcount()); - delete[] sbuf; + delete[] sbuf; } From c3e9922b5d871269bf4ee33da24318d3b5199ac3 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Wed, 15 Oct 2014 01:12:53 +0200 Subject: [PATCH 09/11] Replaced readsome() with read() and gcount() --- frontends/verilog/preproc.cc | 8 +++++--- kernel/yosys.cc | 16 ---------------- kernel/yosys.h | 1 - passes/cmds/write_file.cc | 9 ++++++--- 4 files changed, 11 insertions(+), 23 deletions(-) diff --git a/frontends/verilog/preproc.cc b/frontends/verilog/preproc.cc index b4e77c31b..da658410d 100644 --- a/frontends/verilog/preproc.cc +++ b/frontends/verilog/preproc.cc @@ -196,14 +196,16 @@ static std::string next_token(bool pass_newline = false) static void input_file(std::istream &f, std::string filename) { char buffer[513]; - int rc; insert_input(""); auto it = input_buffer.begin(); input_buffer.insert(it, "`file_push " + filename + "\n"); - while ((rc = readsome(f, buffer, sizeof(buffer)-1)) > 0) { - buffer[rc] = 0; + while (1) { + f.read(buffer, sizeof(buffer)-1); + if (f.gcount() <= 0) + break; + buffer[f.gcount()] = 0; input_buffer.insert(it, buffer); } input_buffer.insert(it, "\n`file_pop\n"); diff --git a/kernel/yosys.cc b/kernel/yosys.cc index e50bfcbe6..ba3049c53 100644 --- a/kernel/yosys.cc +++ b/kernel/yosys.cc @@ -172,22 +172,6 @@ bool patmatch(const char *pattern, const char *string) return false; } -int readsome(std::istream &f, char *s, int n) -{ - int rc = f.readsome(s, n); - - // win32 sometimes returns 0 on a non-empty stream.. - if (rc == 0) { - int c = f.get(); - if (c != EOF) { - *s = c; - rc = 1; - } - } - - return rc; -} - int run_command(const std::string &command, std::function process_line) { if (!process_line) diff --git a/kernel/yosys.h b/kernel/yosys.h index 37d3e52f4..83230cbfb 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -94,7 +94,6 @@ std::string stringf(const char *fmt, ...) __attribute__ ((format (printf, 1, 2)) std::string vstringf(const char *fmt, va_list ap); std::string next_token(std::string &text, const char *sep); bool patmatch(const char *pattern, const char *string); -int readsome(std::istream &f, char *s, int n); int run_command(const std::string &command, std::function process_line = std::function()); std::string make_temp_file(std::string template_str = "/tmp/yosys_XXXXXX"); std::string make_temp_dir(std::string template_str = "/tmp/yosys_XXXXXX"); diff --git a/passes/cmds/write_file.cc b/passes/cmds/write_file.cc index 3f4419724..9bf1a75a8 100644 --- a/passes/cmds/write_file.cc +++ b/passes/cmds/write_file.cc @@ -68,10 +68,13 @@ struct WriteFileFrontend : public Frontend { FILE *of = fopen(output_filename.c_str(), append_mode ? "a" : "w"); char buffer[64 * 1024]; - size_t bytes; - while (0 < (bytes = readsome(*f, buffer, sizeof(buffer)))) - fwrite(buffer, bytes, 1, of); + while (1) { + f->read(buffer, sizeof(buffer)); + if (f->gcount() <= 0) + break; + fwrite(buffer, f->gcount(), 1, of); + } fclose(of); } From f65e1c309fbfd0eae719270bfc8b6887c9e05d9e Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Wed, 15 Oct 2014 01:14:38 +0200 Subject: [PATCH 10/11] Updated .gitignore file for ilang and verilog frontends --- frontends/ilang/.gitignore | 8 ++++---- frontends/verilog/.gitignore | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/frontends/ilang/.gitignore b/frontends/ilang/.gitignore index 72b06b0bf..43106a814 100644 --- a/frontends/ilang/.gitignore +++ b/frontends/ilang/.gitignore @@ -1,4 +1,4 @@ -lexer.cc -parser.output -parser.tab.cc -parser.tab.h +ilang_lexer.cc +ilang_parser.output +ilang_parser.tab.cc +ilang_parser.tab.h diff --git a/frontends/verilog/.gitignore b/frontends/verilog/.gitignore index 72b06b0bf..1d4ae9e5c 100644 --- a/frontends/verilog/.gitignore +++ b/frontends/verilog/.gitignore @@ -1,4 +1,4 @@ -lexer.cc -parser.output -parser.tab.cc -parser.tab.h +verilog_lexer.cc +verilog_parser.output +verilog_parser.tab.cc +verilog_parser.tab.h From 1fc6208ec05af672c7c6b7973b0eba1295bca5f4 Mon Sep 17 00:00:00 2001 From: Clifford Wolf Date: Wed, 15 Oct 2014 01:18:31 +0200 Subject: [PATCH 11/11] Check for _YOSYS_ in yosys.h --- kernel/yosys.h | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/kernel/yosys.h b/kernel/yosys.h index 83230cbfb..239146d77 100644 --- a/kernel/yosys.h +++ b/kernel/yosys.h @@ -58,6 +58,12 @@ #include #include +#ifndef _YOSYS_ +# error It looks like you are trying to build Yosys with the config defines set. \ + When building Yosys with a custom make system, make sure you set all the \ + defines the Yosys Makefile would set for your build configuration. +#endif + #ifdef YOSYS_ENABLE_TCL # include #endif