Added support for signed parameters in ilang
authorClifford Wolf <clifford@clifford.at>
Sun, 24 Nov 2013 16:37:27 +0000 (17:37 +0100)
committerClifford Wolf <clifford@clifford.at>
Sun, 24 Nov 2013 16:37:27 +0000 (17:37 +0100)
backends/ilang/ilang_backend.cc
frontends/ilang/lexer.l
frontends/ilang/parser.y

index b51b3f88bf29192783b6fbd7c8ab9c6c8f50b156..57370841238bbe4b78eced88f4a5f98179429641 100644 (file)
@@ -155,7 +155,7 @@ void ILANG_BACKEND::dump_cell(FILE *f, std::string indent, const RTLIL::Cell *ce
        }
        fprintf(f, "%s" "cell %s %s\n", indent.c_str(), cell->type.c_str(), cell->name.c_str());
        for (auto it = cell->parameters.begin(); it != cell->parameters.end(); it++) {
-               fprintf(f, "%s  parameter %s ", indent.c_str(), it->first.c_str());
+               fprintf(f, "%s  parameter%s %s ", indent.c_str(), cell->signed_parameters.count(it->first) ? " signed" : "", it->first.c_str());
                dump_const(f, it->second);
                fprintf(f, "\n");
        }
index 287f9dbf6b6e4b567b2179a8d45eae5842207b54..d582d04130f4b5945319fddc205ae77fced09305 100644 (file)
@@ -39,6 +39,7 @@
 "module"       { return TOK_MODULE; }
 "attribute"    { return TOK_ATTRIBUTE; }
 "parameter"    { return TOK_PARAMETER; }
+"signed"       { return TOK_SIGNED; }
 "wire"         { return TOK_WIRE; }
 "memory"       { return TOK_MEMORY; }
 "width"                { return TOK_WIDTH; }
index 71c63bc44a8063861814a30718fd1249533ef261..54c2280a84da20be63732de34bd014e6113682bd 100644 (file)
@@ -54,7 +54,7 @@ using namespace ILANG_FRONTEND;
 %token TOK_CELL TOK_CONNECT TOK_SWITCH TOK_CASE TOK_ASSIGN TOK_SYNC
 %token TOK_LOW TOK_HIGH TOK_POSEDGE TOK_NEGEDGE TOK_EDGE TOK_ALWAYS TOK_INIT
 %token TOK_UPDATE TOK_PROCESS TOK_END TOK_INVALID TOK_EOL TOK_OFFSET
-%token TOK_PARAMETER TOK_ATTRIBUTE TOK_MEMORY TOK_SIZE
+%token TOK_PARAMETER TOK_ATTRIBUTE TOK_MEMORY TOK_SIZE TOK_SIGNED
 
 %type <sigspec> sigspec sigspec_list
 %type <integer> sync_type
@@ -189,6 +189,12 @@ cell_body:
                free($3);
                delete $4;
        } |
+       cell_body TOK_PARAMETER TOK_SIGNED TOK_ID constant TOK_EOL {
+               current_cell->parameters[$4] = *$5;
+               current_cell->signed_parameters.insert($4);
+               free($4);
+               delete $5;
+       } |
        cell_body TOK_CONNECT TOK_ID sigspec TOK_EOL {
                if (current_cell->connections.count($3) != 0)
                        rtlil_frontend_ilang_yyerror("scope error");