Added AstNode::mkconst_str API
authorClifford Wolf <clifford@clifford.at>
Thu, 5 Dec 2013 11:53:49 +0000 (12:53 +0100)
committerClifford Wolf <clifford@clifford.at>
Thu, 5 Dec 2013 11:53:49 +0000 (12:53 +0100)
frontends/ast/ast.cc
frontends/ast/ast.h
frontends/verilog/parser.y

index 10c7fc85bf8212809885240b1cfe5ba22825dd30..7d5295a6ce75d3ab0f1340f4bfda0d68b27fdd56 100644 (file)
@@ -658,6 +658,23 @@ AstNode *AstNode::mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signe
        return node;
 }
 
+// create an AST node for a constant (using a string as value)
+AstNode *AstNode::mkconst_str(const std::string &str)
+{
+       std::vector<RTLIL::State> data;
+       data.reserve(str.size() * 8);
+       for (size_t i = 0; i < str.size(); i++) {
+               unsigned char ch = str[str.size() - i - 1];
+               for (int j = 0; j < 8; j++) {
+                       data.push_back((ch & 1) ? RTLIL::S1 : RTLIL::S0);
+                       ch = ch >> 1;
+               }
+       }
+       AstNode *node = AstNode::mkconst_bits(data, false);
+       node->str = str;
+       return node;
+}
+
 RTLIL::Const AstNode::bitsAsConst(int width, bool is_signed)
 {
        std::vector<RTLIL::State> bits = this->bits;
index ab1b9bec54b63e8fb131bd425c2fef6343fb3485..e9dfa5aceb4c1f039a992cf4dd5f0b6e94d43f8b 100644 (file)
@@ -213,6 +213,7 @@ namespace AST
                // helper functions for creating AST nodes for constants
                static AstNode *mkconst_int(uint32_t v, bool is_signed, int width = 32);
                static AstNode *mkconst_bits(const std::vector<RTLIL::State> &v, bool is_signed);
+               static AstNode *mkconst_str(const std::string &str);
 
                // helper function for creating sign-extended const objects
                RTLIL::Const bitsAsConst(int width, bool is_signed);
index 01c9a0095952b5705957dfde9598354fa0043722..f47d1785cd0b53cedf7a91d07fcd6d422aaf03ca 100644 (file)
@@ -1053,18 +1053,7 @@ basic_expr:
                delete $1;
        } |
        TOK_STRING {
-               std::string str = *$1;
-               std::vector<RTLIL::State> data;
-               data.reserve(str.size() * 8);
-               for (size_t i = 0; i < str.size(); i++) {
-                       unsigned char ch = str[str.size() - i - 1];
-                       for (int j = 0; j < 8; j++) {
-                               data.push_back((ch & 1) ? RTLIL::S1 : RTLIL::S0);
-                               ch = ch >> 1;
-                       }
-               }
-               $$ = AstNode::mkconst_bits(data, false);
-               $$->str = str;
+               $$ = AstNode::mkconst_str(*$1);
                delete $1;
        } |
        hierarchical_id attr {