aboutsummaryrefslogtreecommitdiffstats
path: root/frontends/json/jsonparse.cc
diff options
context:
space:
mode:
authorEddie Hung <eddie@fpgeh.com>2019-08-07 13:44:08 -0700
committerEddie Hung <eddie@fpgeh.com>2019-08-07 13:44:08 -0700
commite3d898dccb3cf535a213f313693b2b7a4ede7c68 (patch)
treeca5dfdf506a9a5bc37178eaa06f0d285b7649ff5 /frontends/json/jsonparse.cc
parentcdf9c801347693c273309694685b2080ef00fd02 (diff)
parent3414ee1e3fe37d4bf383621542828d4fc8fc987f (diff)
downloadyosys-e3d898dccb3cf535a213f313693b2b7a4ede7c68.tar.gz
yosys-e3d898dccb3cf535a213f313693b2b7a4ede7c68.tar.bz2
yosys-e3d898dccb3cf535a213f313693b2b7a4ede7c68.zip
Merge remote-tracking branch 'origin/master' into xc7dsp
Diffstat (limited to 'frontends/json/jsonparse.cc')
-rw-r--r--frontends/json/jsonparse.cc57
1 files changed, 34 insertions, 23 deletions
diff --git a/frontends/json/jsonparse.cc b/frontends/json/jsonparse.cc
index f5ae8eb72..7aceffbfc 100644
--- a/frontends/json/jsonparse.cc
+++ b/frontends/json/jsonparse.cc
@@ -25,7 +25,7 @@ struct JsonNode
{
char type; // S=String, N=Number, A=Array, D=Dict
string data_string;
- int data_number;
+ int64_t data_number;
vector<JsonNode*> data_array;
dict<string, JsonNode*> data_dict;
vector<string> data_dict_keys;
@@ -206,6 +206,38 @@ struct JsonNode
}
};
+Const json_parse_attr_param_value(JsonNode *node)
+{
+ Const value;
+
+ if (node->type == 'S') {
+ string &s = node->data_string;
+ size_t cursor = s.find_first_not_of("01xz");
+ if (cursor == string::npos) {
+ value = Const::from_string(s);
+ } else if (s.find_first_not_of(' ', cursor) == string::npos) {
+ value = Const(s.substr(0, GetSize(s)-1));
+ } else {
+ value = Const(s);
+ }
+ } else
+ if (node->type == 'N') {
+ value = Const(node->data_number, 32);
+ if (node->data_number < 0)
+ value.flags |= RTLIL::CONST_FLAG_SIGNED;
+ } else
+ if (node->type == 'A') {
+ log_error("JSON attribute or parameter value is an array.\n");
+ } else
+ if (node->type == 'D') {
+ log_error("JSON attribute or parameter value is a dict.\n");
+ } else {
+ log_abort();
+ }
+
+ return value;
+}
+
void json_parse_attr_param(dict<IdString, Const> &results, JsonNode *node)
{
if (node->type != 'D')
@@ -214,28 +246,7 @@ void json_parse_attr_param(dict<IdString, Const> &results, JsonNode *node)
for (auto it : node->data_dict)
{
IdString key = RTLIL::escape_id(it.first.c_str());
- JsonNode *value_node = it.second;
- Const value;
-
- if (value_node->type == 'S') {
- string &s = value_node->data_string;
- if (s.find_first_not_of("01xz") == string::npos)
- value = Const::from_string(s);
- else
- value = Const(s);
- } else
- if (value_node->type == 'N') {
- value = Const(value_node->data_number, 32);
- } else
- if (value_node->type == 'A') {
- log_error("JSON attribute or parameter value is an array.\n");
- } else
- if (value_node->type == 'D') {
- log_error("JSON attribute or parameter value is a dict.\n");
- } else {
- log_abort();
- }
-
+ Const value = json_parse_attr_param_value(it.second);
results[key] = value;
}
}