|
|
|
@ -105,11 +105,6 @@ static void bad_option_string(const char *option, const char *value, |
|
|
|
abort(); |
|
|
|
} |
|
|
|
|
|
|
|
static void bad_varch_string(const char* varch, const char *msg) |
|
|
|
{ |
|
|
|
bad_option_string("--varch", varch, msg); |
|
|
|
} |
|
|
|
|
|
|
|
static std::string get_string_token(std::string str, const char delimiter, size_t& pos) |
|
|
|
{ |
|
|
|
size_t _pos = pos; |
|
|
|
@ -117,17 +112,6 @@ static std::string get_string_token(std::string str, const char delimiter, size_ |
|
|
|
return str.substr(_pos, pos - _pos); |
|
|
|
} |
|
|
|
|
|
|
|
static int get_int_token(std::string str, const char delimiter, size_t& pos) |
|
|
|
{ |
|
|
|
size_t _pos = pos; |
|
|
|
while (pos < str.length() && str[pos] != delimiter) { |
|
|
|
if (!isdigit(str[pos])) |
|
|
|
bad_varch_string(str.c_str(), "Unsupported value"); // An integer is expected
|
|
|
|
++pos; |
|
|
|
} |
|
|
|
return (pos == _pos) ? 0 : stoi(str.substr(_pos, pos - _pos)); |
|
|
|
} |
|
|
|
|
|
|
|
static bool check_pow2(int val) |
|
|
|
{ |
|
|
|
return ((val & (val - 1))) == 0; |
|
|
|
@ -141,51 +125,6 @@ static std::string strtolower(const char* str) |
|
|
|
return res; |
|
|
|
} |
|
|
|
|
|
|
|
void processor_t::parse_varch_string(const char* s) |
|
|
|
{ |
|
|
|
std::string str = strtolower(s); |
|
|
|
size_t pos = 0; |
|
|
|
size_t len = str.length(); |
|
|
|
int vlen = 0; |
|
|
|
int elen = 0; |
|
|
|
int vstart_alu = 0; |
|
|
|
|
|
|
|
while (pos < len) { |
|
|
|
std::string attr = get_string_token(str, ':', pos); |
|
|
|
|
|
|
|
++pos; |
|
|
|
|
|
|
|
if (attr == "vlen") |
|
|
|
vlen = get_int_token(str, ',', pos); |
|
|
|
else if (attr == "elen") |
|
|
|
elen = get_int_token(str, ',', pos); |
|
|
|
else if (attr == "vstartalu") |
|
|
|
vstart_alu = get_int_token(str, ',', pos); |
|
|
|
else |
|
|
|
bad_varch_string(s, "Unsupported token"); |
|
|
|
|
|
|
|
++pos; |
|
|
|
} |
|
|
|
|
|
|
|
// The integer should be the power of 2
|
|
|
|
if (!check_pow2(vlen) || !check_pow2(elen)) { |
|
|
|
bad_varch_string(s, "The integer value should be the power of 2"); |
|
|
|
} |
|
|
|
|
|
|
|
/* Vector spec requirements. */ |
|
|
|
if (vlen < elen) |
|
|
|
bad_varch_string(s, "vlen must be >= elen"); |
|
|
|
|
|
|
|
/* spike requirements. */ |
|
|
|
if (vlen > 4096) |
|
|
|
bad_varch_string(s, "vlen must be <= 4096"); |
|
|
|
|
|
|
|
VU.VLEN = vlen; |
|
|
|
VU.ELEN = elen; |
|
|
|
VU.vlenb = vlen / 8; |
|
|
|
VU.vstart_alu = vstart_alu; |
|
|
|
} |
|
|
|
|
|
|
|
static int xlen_to_uxl(int xlen) |
|
|
|
{ |
|
|
|
if (xlen == 32) |
|
|
|
|