SDC: Refactor PLL param getter
Signed-off-by: Tomasz Michalak <tmichalak@antmicro.com>
diff --git a/sdc-plugin/buffers.h b/sdc-plugin/buffers.h
index fcce64f..7b512e2 100644
--- a/sdc-plugin/buffers.h
+++ b/sdc-plugin/buffers.h
@@ -46,47 +46,23 @@
struct Pll {
Pll(RTLIL::Cell* cell) : cell(cell) {
assert(RTLIL::unescape_id(cell->type) == "PLLE2_ADV");
- if (cell->hasParam(ID(CLKIN1_PERIOD))) {
- clkin1_period =
- std::stof(cell->getParam(ID(CLKIN1_PERIOD)).decode_string());
- }
- if (cell->hasParam(ID(CLKIN2_PERIOD))) {
- clkin2_period =
- std::stof(cell->getParam(ID(CLKIN2_PERIOD)).decode_string());
- }
- if (cell->hasParam(ID(CLKFBOUT_MULT))) {
- clk_mult = cell->getParam(ID(CLKFBOUT_MULT)).as_int();
- }
- if (cell->hasParam(ID(DIVCLK_DIVIDE))) {
- divclk_divisor = cell->getParam(ID(DIVCLK_DIVIDE)).as_int();
- }
+ clkin1_period = FetchParam(cell, "CLKIN1_PERIOD", 0.0);
+ clkin2_period = FetchParam(cell, "CLKIN2_PERIOD", 0.0);
+ clk_mult = FetchParam(cell, "CLKFBOUT_MULT", 5.0);
+ divclk_divisor = FetchParam(cell, "DIVCLK_DIVIDE", 1.0);
for (auto clk_output : outputs) {
// CLKOUT[0-5]_DIVIDE
- RTLIL::IdString param(RTLIL::escape_id(clk_output + "_DIVIDE"));
- if (cell->hasParam(param)) {
- clkout_divisors[clk_output] = cell->getParam(param).as_int();
- } else {
- clkout_divisors[clk_output] = 1;
- }
+ clkout_divisors[clk_output] = FetchParam(cell, clk_output + "_DIVIDE", 1.0);
clkout_period[clk_output] = CalculatePeriod(clk_output);
// CLKOUT[0-5]_PHASE
- param = RTLIL::escape_id(clk_output + "_PHASE");
- if (cell->hasParam(param)) {
- clkout_phase[clk_output] = std::stof(cell->getParam(param).decode_string());
- } else {
- clkout_phase[clk_output] = 0.0;
- }
+ clkout_phase[clk_output] = FetchParam(cell, clk_output + "_PHASE", 0.0);
+
// Take the delay off the PLL into account
clkout_shift[clk_output] = CalculateShift(clk_output) + delay;
// CLKOUT[0-5]_DUTY_CYCLE
- param = RTLIL::escape_id(clk_output + "_DUTY_CYCLE");
- if (cell->hasParam(param)) {
- clkout_duty_cycle[clk_output] = std::stof(cell->getParam(param).decode_string());
- } else {
- clkout_duty_cycle[clk_output] = 0.5;
- }
+ clkout_duty_cycle[clk_output] = FetchParam(cell, clk_output + "_DUTY_CYCLE", 0.5);
}
};
@@ -102,20 +78,35 @@
return clkout_period.at(output) * clkout_phase.at(output) / 360.0;
}
+ float FetchParam(RTLIL::Cell* cell, std::string&& param_name, float default_value) {
+ RTLIL::IdString param(RTLIL::escape_id(param_name));
+ if (cell->hasParam(param)) {
+ auto param_obj = cell->parameters.at(param);
+ std::string value;
+ if (param_obj.flags & RTLIL::CONST_FLAG_STRING) {
+ value = param_obj.decode_string();
+ } else {
+ value = std::to_string(param_obj.as_int());
+ }
+ return std::stof(value);
+ }
+ return default_value;
+ }
+
static const float delay;
static const std::string name;
static const std::vector<std::string> inputs;
static const std::vector<std::string> outputs;
RTLIL::Cell* cell;
- float clkin1_period = 0;
- float clkin2_period = 0;
std::unordered_map<std::string, float> clkout_period;
std::unordered_map<std::string, float> clkout_duty_cycle;
std::unordered_map<std::string, float> clkout_phase;
std::unordered_map<std::string, float> clkout_shift;
- std::unordered_map<std::string, int> clkout_divisors;
- int divclk_divisor = 1;
- int clk_mult = 5;
+ std::unordered_map<std::string, float> clkout_divisors;
+ float clkin1_period;
+ float clkin2_period;
+ float divclk_divisor;
+ float clk_mult;
};
#endif // _BUFFERS_H_