Merge remote-tracking branch 'parallax/master'
This commit is contained in:
commit
94dc4a04c6
|
|
@ -77,16 +77,29 @@ VcdParse::read(const char *filename,
|
||||||
else if (token == "$dumpall")
|
else if (token == "$dumpall")
|
||||||
// Ignore dumpall body.
|
// Ignore dumpall body.
|
||||||
readStmtTokens();
|
readStmtTokens();
|
||||||
|
// Read initial values
|
||||||
else if (token == "$dumpvars")
|
else if (token == "$dumpvars")
|
||||||
// Initial values.
|
// Initial values.
|
||||||
parseVarValues();
|
parseVarValues();
|
||||||
else if (token[0] == '#') {
|
else if (token[0] == '#') {
|
||||||
time_ = stoll(token.substr(1));
|
try {
|
||||||
|
time_ = stoll(token.substr(1));
|
||||||
|
}
|
||||||
|
catch (std::invalid_argument &error) {
|
||||||
|
report_->fileError(805, filename_, file_line_, "invalid time %s",
|
||||||
|
token.substr(1).c_str());
|
||||||
|
}
|
||||||
|
catch (std::out_of_range &error) {
|
||||||
|
report_->fileError(806, filename_, file_line_, "time out of range %s",
|
||||||
|
token.substr(1).c_str());
|
||||||
|
}
|
||||||
reader_->setTimeMin(time_);
|
reader_->setTimeMin(time_);
|
||||||
prev_time_ = time_;
|
prev_time_ = time_;
|
||||||
}
|
}
|
||||||
else if (token[0] == '$')
|
else if (token[0] == '$')
|
||||||
report_->fileError(800, filename_, stmt_line_, "unhandled vcd command.");
|
report_->fileError(800, filename_, file_line_, "unknown vcd command.");
|
||||||
|
else
|
||||||
|
parseVarValues();
|
||||||
|
|
||||||
token = getToken();
|
token = getToken();
|
||||||
}
|
}
|
||||||
|
|
@ -123,7 +136,7 @@ VcdParse::parseTimescale()
|
||||||
setTimeUnit(tokens[1], time_scale);
|
setTimeUnit(tokens[1], time_scale);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
report_->fileError(801, filename_, stmt_line_, "timescale syntax error.");
|
report_->fileError(801, filename_, file_line_, "timescale syntax error.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -138,7 +151,7 @@ VcdParse::setTimeUnit(const string &time_unit,
|
||||||
else if (time_unit == "ns")
|
else if (time_unit == "ns")
|
||||||
time_unit_scale = 1e-9;
|
time_unit_scale = 1e-9;
|
||||||
else
|
else
|
||||||
report_->fileError(802, filename_, stmt_line_, "Unknown timescale unit.");
|
report_->fileError(802, filename_, file_line_, "Unknown timescale unit.");
|
||||||
reader_->setTimeUnit(time_unit, time_unit_scale, time_scale);
|
reader_->setTimeUnit(time_unit, time_unit_scale, time_scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -170,7 +183,7 @@ VcdParse::parseVar()
|
||||||
string type_name = tokens[0];
|
string type_name = tokens[0];
|
||||||
VcdVarType type = vcd_var_type_map.find(type_name, VcdVarType::unknown);
|
VcdVarType type = vcd_var_type_map.find(type_name, VcdVarType::unknown);
|
||||||
if (type == VcdVarType::unknown)
|
if (type == VcdVarType::unknown)
|
||||||
report_->fileWarn(1370, filename_, stmt_line_,
|
report_->fileWarn(1370, filename_, file_line_,
|
||||||
"Unknown variable type %s.",
|
"Unknown variable type %s.",
|
||||||
type_name.c_str());
|
type_name.c_str());
|
||||||
else {
|
else {
|
||||||
|
|
@ -189,7 +202,7 @@ VcdParse::parseVar()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
report_->fileError(804, filename_, stmt_line_, "Variable syntax error.");
|
report_->fileError(804, filename_, file_line_, "Variable syntax error.");
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
@ -227,15 +240,17 @@ VcdParse::parseVarValues()
|
||||||
|| char0 == 'Z') {
|
|| char0 == 'Z') {
|
||||||
string id = token.substr(1);
|
string id = token.substr(1);
|
||||||
if (!reader_->varIdValid(id))
|
if (!reader_->varIdValid(id))
|
||||||
report_->fileError(805, filename_, stmt_line_,
|
report_->fileError(805, filename_, file_line_,
|
||||||
"unknown variable %s", id.c_str());
|
"unknown variable %s", id.c_str());
|
||||||
reader_->varAppendValue(id, time_, char0);
|
reader_->varAppendValue(id, time_, char0);
|
||||||
}
|
}
|
||||||
else if (char0 == 'B') {
|
else if (char0 == 'B') {
|
||||||
|
if (file_line_ == 148904)
|
||||||
|
printf("luse\n");
|
||||||
string bus_value = token.substr(1);
|
string bus_value = token.substr(1);
|
||||||
string id = getToken();
|
string id = getToken();
|
||||||
if (!reader_->varIdValid(id))
|
if (!reader_->varIdValid(id))
|
||||||
report_->fileError(807, filename_, stmt_line_,
|
report_->fileError(807, filename_, file_line_,
|
||||||
"unknown variable %s", id.c_str());
|
"unknown variable %s", id.c_str());
|
||||||
else {
|
else {
|
||||||
// Reverse the bus value to match the bit order in the VCD file.
|
// Reverse the bus value to match the bit order in the VCD file.
|
||||||
|
|
|
||||||
|
|
@ -406,7 +406,7 @@ ReadVcdActivities::readActivities()
|
||||||
{
|
{
|
||||||
ClockSeq *clks = sdc_->clocks();
|
ClockSeq *clks = sdc_->clocks();
|
||||||
if (clks->empty())
|
if (clks->empty())
|
||||||
report_->error(805, "No clocks have been defined.");
|
report_->error(820, "No clocks have been defined.");
|
||||||
|
|
||||||
vcd_parse_.read(filename_, &vcd_reader_);
|
vcd_parse_.read(filename_, &vcd_reader_);
|
||||||
|
|
||||||
|
|
@ -454,20 +454,26 @@ void
|
||||||
ReadVcdActivities::checkClkPeriod(const Pin *pin,
|
ReadVcdActivities::checkClkPeriod(const Pin *pin,
|
||||||
double transition_count)
|
double transition_count)
|
||||||
{
|
{
|
||||||
VcdTime time_max = vcd_reader_.timeMax();
|
|
||||||
VcdTime time_min = vcd_reader_.timeMin();
|
|
||||||
double time_scale = vcd_reader_.timeScale();
|
|
||||||
double sim_period = (time_max - time_min) * time_scale / (transition_count / 2.0);
|
|
||||||
ClockSet *clks = sdc_->findLeafPinClocks(pin);
|
ClockSet *clks = sdc_->findLeafPinClocks(pin);
|
||||||
if (clks) {
|
if (clks) {
|
||||||
|
VcdTime time_max = vcd_reader_.timeMax();
|
||||||
|
VcdTime time_min = vcd_reader_.timeMin();
|
||||||
|
double time_scale = vcd_reader_.timeScale();
|
||||||
|
double sim_period = (time_max - time_min) * time_scale / (transition_count / 2.0);
|
||||||
for (Clock *clk : *clks) {
|
for (Clock *clk : *clks) {
|
||||||
double clk_period = clk->period();
|
if (transition_count == 0)
|
||||||
if (abs((clk_period - sim_period) / clk_period) > sim_clk_period_tolerance_)
|
report_->warn(1452, "clock %s pin %s has no vcd transitions.",
|
||||||
// Warn if sim clock period differs from SDC by more than 10%.
|
|
||||||
report_->warn(1452, "clock %s vcd period %s differs from SDC clock period %s",
|
|
||||||
clk->name(),
|
clk->name(),
|
||||||
delayAsString(sim_period, this),
|
sdc_network_->pathName(pin));
|
||||||
delayAsString(clk_period, this));
|
else {
|
||||||
|
double clk_period = clk->period();
|
||||||
|
if (abs((clk_period - sim_period) / clk_period) > sim_clk_period_tolerance_)
|
||||||
|
// Warn if sim clock period differs from SDC by more than 10%.
|
||||||
|
report_->warn(1452, "clock %s vcd period %s differs from SDC clock period %s",
|
||||||
|
clk->name(),
|
||||||
|
delayAsString(sim_period, this),
|
||||||
|
delayAsString(clk_period, this));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue