StaTcl.i cleanup
Signed-off-by: James Cherry <cherry@parallaxsw.com>
This commit is contained in:
parent
d51497c12d
commit
2c77aa2daf
|
|
@ -197,6 +197,12 @@ find_liberty_cell(const char *name)
|
||||||
return cmdNetwork()->findLibertyCell(name);
|
return cmdNetwork()->findLibertyCell(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool
|
||||||
|
timing_role_is_check(TimingRole *role)
|
||||||
|
{
|
||||||
|
return role->isTimingCheck();
|
||||||
|
}
|
||||||
|
|
||||||
%} // inline
|
%} // inline
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
|
||||||
446
search/Search.i
446
search/Search.i
|
|
@ -306,6 +306,18 @@ report_loops()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
char
|
||||||
|
pin_sim_logic_value(const Pin *pin)
|
||||||
|
{
|
||||||
|
return logicValueString(Sta::sta()->simLogicValue(pin));
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceSeq
|
||||||
|
slow_drivers(int count)
|
||||||
|
{
|
||||||
|
return Sta::sta()->slowDrivers(count);
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
PathEndSeq
|
PathEndSeq
|
||||||
|
|
@ -456,6 +468,366 @@ report_path_cmd(PathRef *path)
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void
|
||||||
|
report_clk_skew(ConstClockSeq clks,
|
||||||
|
const Corner *corner,
|
||||||
|
const SetupHold *setup_hold,
|
||||||
|
bool include_internal_latency,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta::sta()->reportClkSkew(clks, corner, setup_hold,
|
||||||
|
include_internal_latency, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_clk_latency(ConstClockSeq clks,
|
||||||
|
const Corner *corner,
|
||||||
|
bool include_internal_latency,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta::sta()->reportClkLatency(clks, corner, include_internal_latency, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
worst_clk_skew_cmd(const SetupHold *setup_hold,
|
||||||
|
bool include_internal_latency)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->findWorstClkSkew(setup_hold, include_internal_latency);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MinPulseWidthCheckSeq &
|
||||||
|
min_pulse_width_violations(const Corner *corner)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->minPulseWidthViolations(corner);
|
||||||
|
}
|
||||||
|
|
||||||
|
MinPulseWidthCheckSeq &
|
||||||
|
min_pulse_width_check_pins(PinSeq *pins,
|
||||||
|
const Corner *corner)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
MinPulseWidthCheckSeq &checks = sta->minPulseWidthChecks(pins, corner);
|
||||||
|
delete pins;
|
||||||
|
return checks;
|
||||||
|
}
|
||||||
|
|
||||||
|
MinPulseWidthCheckSeq &
|
||||||
|
min_pulse_width_checks(const Corner *corner)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->minPulseWidthChecks(corner);
|
||||||
|
}
|
||||||
|
|
||||||
|
MinPulseWidthCheck *
|
||||||
|
min_pulse_width_check_slack(const Corner *corner)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->minPulseWidthSlack(corner);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_mpw_checks(MinPulseWidthCheckSeq *checks,
|
||||||
|
bool verbose)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportMpwChecks(checks, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_mpw_check(MinPulseWidthCheck *check,
|
||||||
|
bool verbose)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportMpwCheck(check, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MinPeriodCheckSeq &
|
||||||
|
min_period_violations()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->minPeriodViolations();
|
||||||
|
}
|
||||||
|
|
||||||
|
MinPeriodCheck *
|
||||||
|
min_period_check_slack()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->minPeriodSlack();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_min_period_checks(MinPeriodCheckSeq *checks,
|
||||||
|
bool verbose)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportChecks(checks, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_min_period_check(MinPeriodCheck *check,
|
||||||
|
bool verbose)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportCheck(check, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
MaxSkewCheckSeq &
|
||||||
|
max_skew_violations()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->maxSkewViolations();
|
||||||
|
}
|
||||||
|
|
||||||
|
MaxSkewCheck *
|
||||||
|
max_skew_check_slack()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->maxSkewSlack();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_max_skew_checks(MaxSkewCheckSeq *checks,
|
||||||
|
bool verbose)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportChecks(checks, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_max_skew_check(MaxSkewCheck *check,
|
||||||
|
bool verbose)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportCheck(check, verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
Slack
|
||||||
|
find_clk_min_period(const Clock *clk,
|
||||||
|
bool ignore_port_paths)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
return sta->findClkMinPeriod(clk, ignore_port_paths);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
PinSeq
|
||||||
|
check_slew_limits(Net *net,
|
||||||
|
bool violators,
|
||||||
|
const Corner *corner,
|
||||||
|
const MinMax *min_max)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->checkSlewLimits(net, violators, corner, min_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
max_slew_violation_count()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->checkSlewLimits(nullptr, true, nullptr, MinMax::max()).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
max_slew_check_slack()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
const Pin *pin;
|
||||||
|
Slew slew;
|
||||||
|
float slack;
|
||||||
|
float limit;
|
||||||
|
sta->maxSlewCheck(pin, slew, slack, limit);
|
||||||
|
return sta->units()->timeUnit()->staToUser(slack);
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
max_slew_check_limit()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
const Pin *pin;
|
||||||
|
Slew slew;
|
||||||
|
float slack;
|
||||||
|
float limit;
|
||||||
|
sta->maxSlewCheck(pin, slew, slack, limit);
|
||||||
|
return sta->units()->timeUnit()->staToUser(limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_slew_limit_short_header()
|
||||||
|
{
|
||||||
|
Sta::sta()->reportSlewLimitShortHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_slew_limit_short(Pin *pin,
|
||||||
|
const Corner *corner,
|
||||||
|
const MinMax *min_max)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportSlewLimitShort(pin, corner, min_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_slew_limit_verbose(Pin *pin,
|
||||||
|
const Corner *corner,
|
||||||
|
const MinMax *min_max)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportSlewLimitVerbose(pin, corner, min_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
PinSeq
|
||||||
|
check_fanout_limits(Net *net,
|
||||||
|
bool violators,
|
||||||
|
const MinMax *min_max)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->checkFanoutLimits(net, violators, min_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
max_fanout_violation_count()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->checkFanoutLimits(nullptr, true, MinMax::max()).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
max_fanout_check_slack()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
const Pin *pin;
|
||||||
|
float fanout;
|
||||||
|
float slack;
|
||||||
|
float limit;
|
||||||
|
sta->maxFanoutCheck(pin, fanout, slack, limit);
|
||||||
|
return slack;;
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
max_fanout_check_limit()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
const Pin *pin;
|
||||||
|
float fanout;
|
||||||
|
float slack;
|
||||||
|
float limit;
|
||||||
|
sta->maxFanoutCheck(pin, fanout, slack, limit);
|
||||||
|
return limit;;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_fanout_limit_short_header()
|
||||||
|
{
|
||||||
|
Sta::sta()->reportFanoutLimitShortHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_fanout_limit_short(Pin *pin,
|
||||||
|
const MinMax *min_max)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportFanoutLimitShort(pin, min_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_fanout_limit_verbose(Pin *pin,
|
||||||
|
const MinMax *min_max)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportFanoutLimitVerbose(pin, min_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
PinSeq
|
||||||
|
check_capacitance_limits(Net *net,
|
||||||
|
bool violators,
|
||||||
|
const Corner *corner,
|
||||||
|
const MinMax *min_max)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->checkCapacitanceLimits(net, violators, corner, min_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t
|
||||||
|
max_capacitance_violation_count()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
return Sta::sta()->checkCapacitanceLimits(nullptr, true,nullptr,MinMax::max()).size();
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
max_capacitance_check_slack()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
const Pin *pin;
|
||||||
|
float capacitance;
|
||||||
|
float slack;
|
||||||
|
float limit;
|
||||||
|
sta->maxCapacitanceCheck(pin, capacitance, slack, limit);
|
||||||
|
return sta->units()->capacitanceUnit()->staToUser(slack);
|
||||||
|
}
|
||||||
|
|
||||||
|
float
|
||||||
|
max_capacitance_check_limit()
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
const Pin *pin;
|
||||||
|
float capacitance;
|
||||||
|
float slack;
|
||||||
|
float limit;
|
||||||
|
sta->maxCapacitanceCheck(pin, capacitance, slack, limit);
|
||||||
|
return sta->units()->capacitanceUnit()->staToUser(limit);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_capacitance_limit_short_header()
|
||||||
|
{
|
||||||
|
Sta::sta()->reportCapacitanceLimitShortHeader();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_capacitance_limit_short(Pin *pin,
|
||||||
|
const Corner *corner,
|
||||||
|
const MinMax *min_max)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportCapacitanceLimitShort(pin, corner, min_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
report_capacitance_limit_verbose(Pin *pin,
|
||||||
|
const Corner *corner,
|
||||||
|
const MinMax *min_max)
|
||||||
|
{
|
||||||
|
Sta::sta()->reportCapacitanceLimitVerbose(pin, corner, min_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
void
|
||||||
|
write_timing_model_cmd(const char *lib_name,
|
||||||
|
const char *cell_name,
|
||||||
|
const char *filename,
|
||||||
|
const Corner *corner)
|
||||||
|
{
|
||||||
|
Sta::sta()->writeTimingModel(lib_name, cell_name, filename, corner);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void
|
void
|
||||||
define_corners_cmd(StringSet *corner_names)
|
define_corners_cmd(StringSet *corner_names)
|
||||||
{
|
{
|
||||||
|
|
@ -512,6 +884,80 @@ check_timing_cmd(bool no_input_delay,
|
||||||
loops, generated_clks);
|
loops, generated_clks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
PinSet
|
||||||
|
find_fanin_pins(PinSeq *to,
|
||||||
|
bool flat,
|
||||||
|
bool startpoints_only,
|
||||||
|
int inst_levels,
|
||||||
|
int pin_levels,
|
||||||
|
bool thru_disabled,
|
||||||
|
bool thru_constants)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
PinSet fanin = sta->findFaninPins(to, flat, startpoints_only,
|
||||||
|
inst_levels, pin_levels,
|
||||||
|
thru_disabled, thru_constants);
|
||||||
|
delete to;
|
||||||
|
return fanin;
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceSet
|
||||||
|
find_fanin_insts(PinSeq *to,
|
||||||
|
bool flat,
|
||||||
|
bool startpoints_only,
|
||||||
|
int inst_levels,
|
||||||
|
int pin_levels,
|
||||||
|
bool thru_disabled,
|
||||||
|
bool thru_constants)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
InstanceSet fanin = sta->findFaninInstances(to, flat, startpoints_only,
|
||||||
|
inst_levels, pin_levels,
|
||||||
|
thru_disabled, thru_constants);
|
||||||
|
delete to;
|
||||||
|
return fanin;
|
||||||
|
}
|
||||||
|
|
||||||
|
PinSet
|
||||||
|
find_fanout_pins(PinSeq *from,
|
||||||
|
bool flat,
|
||||||
|
bool endpoints_only,
|
||||||
|
int inst_levels,
|
||||||
|
int pin_levels,
|
||||||
|
bool thru_disabled,
|
||||||
|
bool thru_constants)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
PinSet fanout = sta->findFanoutPins(from, flat, endpoints_only,
|
||||||
|
inst_levels, pin_levels,
|
||||||
|
thru_disabled, thru_constants);
|
||||||
|
delete from;
|
||||||
|
return fanout;
|
||||||
|
}
|
||||||
|
|
||||||
|
InstanceSet
|
||||||
|
find_fanout_insts(PinSeq *from,
|
||||||
|
bool flat,
|
||||||
|
bool endpoints_only,
|
||||||
|
int inst_levels,
|
||||||
|
int pin_levels,
|
||||||
|
bool thru_disabled,
|
||||||
|
bool thru_constants)
|
||||||
|
{
|
||||||
|
cmdLinkedNetwork();
|
||||||
|
Sta *sta = Sta::sta();
|
||||||
|
InstanceSet fanout = sta->findFanoutInstances(from, flat, endpoints_only,
|
||||||
|
inst_levels, pin_levels,
|
||||||
|
thru_disabled, thru_constants);
|
||||||
|
delete from;
|
||||||
|
return fanout;
|
||||||
|
}
|
||||||
|
|
||||||
%} // inline
|
%} // inline
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
|
||||||
621
tcl/StaTcl.i
621
tcl/StaTcl.i
|
|
@ -35,7 +35,6 @@
|
||||||
#include "Error.hh"
|
#include "Error.hh"
|
||||||
#include "Fuzzy.hh"
|
#include "Fuzzy.hh"
|
||||||
#include "Units.hh"
|
#include "Units.hh"
|
||||||
#include "Transition.hh"
|
|
||||||
#include "Property.hh"
|
#include "Property.hh"
|
||||||
#include "Sta.hh"
|
#include "Sta.hh"
|
||||||
|
|
||||||
|
|
@ -48,8 +47,6 @@ namespace sta {
|
||||||
//
|
//
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
typedef MinPulseWidthCheckSeq::Iterator MinPulseWidthCheckSeqIterator;
|
|
||||||
|
|
||||||
// Get the network for commands.
|
// Get the network for commands.
|
||||||
Network *
|
Network *
|
||||||
cmdNetwork()
|
cmdNetwork()
|
||||||
|
|
@ -101,20 +98,6 @@ using namespace sta;
|
||||||
|
|
||||||
%}
|
%}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Empty class definitions to make swig happy.
|
|
||||||
// Private constructor/destructor so swig doesn't emit them.
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
class Transition
|
|
||||||
{
|
|
||||||
private:
|
|
||||||
Transition();
|
|
||||||
~Transition();
|
|
||||||
};
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// C++ functions visible as TCL functions.
|
// C++ functions visible as TCL functions.
|
||||||
|
|
@ -380,75 +363,9 @@ delete_all_memory()
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
// format_unit functions print with fixed digits and suffix.
|
// Units
|
||||||
// Pass value arg as string to support NaNs.
|
//
|
||||||
const char *
|
|
||||||
format_time(const char *value,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
float value1 = strtof(value, nullptr);
|
|
||||||
return Sta::sta()->units()->timeUnit()->asString(value1, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
format_capacitance(const char *value,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
float value1 = strtof(value, nullptr);
|
|
||||||
return Sta::sta()->units()->capacitanceUnit()->asString(value1, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
format_resistance(const char *value,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
float value1 = strtof(value, nullptr);
|
|
||||||
return Sta::sta()->units()->resistanceUnit()->asString(value1, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
format_voltage(const char *value,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
float value1 = strtof(value, nullptr);
|
|
||||||
return Sta::sta()->units()->voltageUnit()->asString(value1, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
format_current(const char *value,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
float value1 = strtof(value, nullptr);
|
|
||||||
return Sta::sta()->units()->currentUnit()->asString(value1, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
format_power(const char *value,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
float value1 = strtof(value, nullptr);
|
|
||||||
return Sta::sta()->units()->powerUnit()->asString(value1, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
format_distance(const char *value,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
float value1 = strtof(value, nullptr);
|
|
||||||
Unit *dist_unit = Sta::sta()->units()->distanceUnit();
|
|
||||||
return dist_unit->asString(value1, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
const char *
|
|
||||||
format_area(const char *value,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
float value1 = strtof(value, nullptr);
|
|
||||||
Unit *dist_unit = Sta::sta()->units()->distanceUnit();
|
|
||||||
return dist_unit->asString(value1 / dist_unit->scale(), digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// <unit>_sta_ui conversion from sta units to user interface units.
|
// <unit>_sta_ui conversion from sta units to user interface units.
|
||||||
|
|
@ -624,6 +541,76 @@ unit_scale(const char *unit_name)
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// format_unit functions print with fixed digits and suffix.
|
||||||
|
// Pass value arg as string to support NaNs.
|
||||||
|
const char *
|
||||||
|
format_time(const char *value,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
float value1 = strtof(value, nullptr);
|
||||||
|
return Sta::sta()->units()->timeUnit()->asString(value1, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
format_capacitance(const char *value,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
float value1 = strtof(value, nullptr);
|
||||||
|
return Sta::sta()->units()->capacitanceUnit()->asString(value1, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
format_resistance(const char *value,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
float value1 = strtof(value, nullptr);
|
||||||
|
return Sta::sta()->units()->resistanceUnit()->asString(value1, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
format_voltage(const char *value,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
float value1 = strtof(value, nullptr);
|
||||||
|
return Sta::sta()->units()->voltageUnit()->asString(value1, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
format_current(const char *value,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
float value1 = strtof(value, nullptr);
|
||||||
|
return Sta::sta()->units()->currentUnit()->asString(value1, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
format_power(const char *value,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
float value1 = strtof(value, nullptr);
|
||||||
|
return Sta::sta()->units()->powerUnit()->asString(value1, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
format_distance(const char *value,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
float value1 = strtof(value, nullptr);
|
||||||
|
Unit *dist_unit = Sta::sta()->units()->distanceUnit();
|
||||||
|
return dist_unit->asString(value1, digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *
|
||||||
|
format_area(const char *value,
|
||||||
|
int digits)
|
||||||
|
{
|
||||||
|
float value1 = strtof(value, nullptr);
|
||||||
|
Unit *dist_unit = Sta::sta()->units()->distanceUnit();
|
||||||
|
return dist_unit->asString(value1 / dist_unit->scale(), digits);
|
||||||
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
const char *
|
const char *
|
||||||
rise_short_name()
|
rise_short_name()
|
||||||
{
|
{
|
||||||
|
|
@ -636,6 +623,10 @@ fall_short_name()
|
||||||
return RiseFall::fall()->shortName();
|
return RiseFall::fall()->shortName();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////
|
||||||
|
//
|
||||||
|
// Properties
|
||||||
|
//
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
PropertyValue
|
PropertyValue
|
||||||
|
|
@ -938,366 +929,6 @@ set_propagate_all_clocks(bool prop)
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
void
|
|
||||||
report_clk_skew(ConstClockSeq clks,
|
|
||||||
const Corner *corner,
|
|
||||||
const SetupHold *setup_hold,
|
|
||||||
bool include_internal_latency,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta::sta()->reportClkSkew(clks, corner, setup_hold,
|
|
||||||
include_internal_latency, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_clk_latency(ConstClockSeq clks,
|
|
||||||
const Corner *corner,
|
|
||||||
bool include_internal_latency,
|
|
||||||
int digits)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta::sta()->reportClkLatency(clks, corner, include_internal_latency, digits);
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
worst_clk_skew_cmd(const SetupHold *setup_hold,
|
|
||||||
bool include_internal_latency)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->findWorstClkSkew(setup_hold, include_internal_latency);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
MinPulseWidthCheckSeq &
|
|
||||||
min_pulse_width_violations(const Corner *corner)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->minPulseWidthViolations(corner);
|
|
||||||
}
|
|
||||||
|
|
||||||
MinPulseWidthCheckSeq &
|
|
||||||
min_pulse_width_check_pins(PinSeq *pins,
|
|
||||||
const Corner *corner)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
MinPulseWidthCheckSeq &checks = sta->minPulseWidthChecks(pins, corner);
|
|
||||||
delete pins;
|
|
||||||
return checks;
|
|
||||||
}
|
|
||||||
|
|
||||||
MinPulseWidthCheckSeq &
|
|
||||||
min_pulse_width_checks(const Corner *corner)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->minPulseWidthChecks(corner);
|
|
||||||
}
|
|
||||||
|
|
||||||
MinPulseWidthCheck *
|
|
||||||
min_pulse_width_check_slack(const Corner *corner)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->minPulseWidthSlack(corner);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_mpw_checks(MinPulseWidthCheckSeq *checks,
|
|
||||||
bool verbose)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportMpwChecks(checks, verbose);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_mpw_check(MinPulseWidthCheck *check,
|
|
||||||
bool verbose)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportMpwCheck(check, verbose);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
MinPeriodCheckSeq &
|
|
||||||
min_period_violations()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->minPeriodViolations();
|
|
||||||
}
|
|
||||||
|
|
||||||
MinPeriodCheck *
|
|
||||||
min_period_check_slack()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->minPeriodSlack();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_min_period_checks(MinPeriodCheckSeq *checks,
|
|
||||||
bool verbose)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportChecks(checks, verbose);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_min_period_check(MinPeriodCheck *check,
|
|
||||||
bool verbose)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportCheck(check, verbose);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
MaxSkewCheckSeq &
|
|
||||||
max_skew_violations()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->maxSkewViolations();
|
|
||||||
}
|
|
||||||
|
|
||||||
MaxSkewCheck *
|
|
||||||
max_skew_check_slack()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->maxSkewSlack();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_max_skew_checks(MaxSkewCheckSeq *checks,
|
|
||||||
bool verbose)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportChecks(checks, verbose);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_max_skew_check(MaxSkewCheck *check,
|
|
||||||
bool verbose)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportCheck(check, verbose);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
Slack
|
|
||||||
find_clk_min_period(const Clock *clk,
|
|
||||||
bool ignore_port_paths)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
return sta->findClkMinPeriod(clk, ignore_port_paths);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
PinSeq
|
|
||||||
check_slew_limits(Net *net,
|
|
||||||
bool violators,
|
|
||||||
const Corner *corner,
|
|
||||||
const MinMax *min_max)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->checkSlewLimits(net, violators, corner, min_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t
|
|
||||||
max_slew_violation_count()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->checkSlewLimits(nullptr, true, nullptr, MinMax::max()).size();
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
max_slew_check_slack()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
const Pin *pin;
|
|
||||||
Slew slew;
|
|
||||||
float slack;
|
|
||||||
float limit;
|
|
||||||
sta->maxSlewCheck(pin, slew, slack, limit);
|
|
||||||
return sta->units()->timeUnit()->staToUser(slack);
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
max_slew_check_limit()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
const Pin *pin;
|
|
||||||
Slew slew;
|
|
||||||
float slack;
|
|
||||||
float limit;
|
|
||||||
sta->maxSlewCheck(pin, slew, slack, limit);
|
|
||||||
return sta->units()->timeUnit()->staToUser(limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_slew_limit_short_header()
|
|
||||||
{
|
|
||||||
Sta::sta()->reportSlewLimitShortHeader();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_slew_limit_short(Pin *pin,
|
|
||||||
const Corner *corner,
|
|
||||||
const MinMax *min_max)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportSlewLimitShort(pin, corner, min_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_slew_limit_verbose(Pin *pin,
|
|
||||||
const Corner *corner,
|
|
||||||
const MinMax *min_max)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportSlewLimitVerbose(pin, corner, min_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
PinSeq
|
|
||||||
check_fanout_limits(Net *net,
|
|
||||||
bool violators,
|
|
||||||
const MinMax *min_max)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->checkFanoutLimits(net, violators, min_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t
|
|
||||||
max_fanout_violation_count()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->checkFanoutLimits(nullptr, true, MinMax::max()).size();
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
max_fanout_check_slack()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
const Pin *pin;
|
|
||||||
float fanout;
|
|
||||||
float slack;
|
|
||||||
float limit;
|
|
||||||
sta->maxFanoutCheck(pin, fanout, slack, limit);
|
|
||||||
return slack;;
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
max_fanout_check_limit()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
const Pin *pin;
|
|
||||||
float fanout;
|
|
||||||
float slack;
|
|
||||||
float limit;
|
|
||||||
sta->maxFanoutCheck(pin, fanout, slack, limit);
|
|
||||||
return limit;;
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_fanout_limit_short_header()
|
|
||||||
{
|
|
||||||
Sta::sta()->reportFanoutLimitShortHeader();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_fanout_limit_short(Pin *pin,
|
|
||||||
const MinMax *min_max)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportFanoutLimitShort(pin, min_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_fanout_limit_verbose(Pin *pin,
|
|
||||||
const MinMax *min_max)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportFanoutLimitVerbose(pin, min_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
PinSeq
|
|
||||||
check_capacitance_limits(Net *net,
|
|
||||||
bool violators,
|
|
||||||
const Corner *corner,
|
|
||||||
const MinMax *min_max)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->checkCapacitanceLimits(net, violators, corner, min_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t
|
|
||||||
max_capacitance_violation_count()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
return Sta::sta()->checkCapacitanceLimits(nullptr, true,nullptr,MinMax::max()).size();
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
max_capacitance_check_slack()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
const Pin *pin;
|
|
||||||
float capacitance;
|
|
||||||
float slack;
|
|
||||||
float limit;
|
|
||||||
sta->maxCapacitanceCheck(pin, capacitance, slack, limit);
|
|
||||||
return sta->units()->capacitanceUnit()->staToUser(slack);
|
|
||||||
}
|
|
||||||
|
|
||||||
float
|
|
||||||
max_capacitance_check_limit()
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
const Pin *pin;
|
|
||||||
float capacitance;
|
|
||||||
float slack;
|
|
||||||
float limit;
|
|
||||||
sta->maxCapacitanceCheck(pin, capacitance, slack, limit);
|
|
||||||
return sta->units()->capacitanceUnit()->staToUser(limit);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_capacitance_limit_short_header()
|
|
||||||
{
|
|
||||||
Sta::sta()->reportCapacitanceLimitShortHeader();
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_capacitance_limit_short(Pin *pin,
|
|
||||||
const Corner *corner,
|
|
||||||
const MinMax *min_max)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportCapacitanceLimitShort(pin, corner, min_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
report_capacitance_limit_verbose(Pin *pin,
|
|
||||||
const Corner *corner,
|
|
||||||
const MinMax *min_max)
|
|
||||||
{
|
|
||||||
Sta::sta()->reportCapacitanceLimitVerbose(pin, corner, min_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
void
|
|
||||||
write_timing_model_cmd(const char *lib_name,
|
|
||||||
const char *cell_name,
|
|
||||||
const char *filename,
|
|
||||||
const Corner *corner)
|
|
||||||
{
|
|
||||||
Sta::sta()->writeTimingModel(lib_name, cell_name, filename, corner);
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
bool
|
bool
|
||||||
fuzzy_equal(float value1,
|
fuzzy_equal(float value1,
|
||||||
float value2)
|
float value2)
|
||||||
|
|
@ -1305,106 +936,8 @@ fuzzy_equal(float value1,
|
||||||
return fuzzyEqual(value1, value2);
|
return fuzzyEqual(value1, value2);
|
||||||
}
|
}
|
||||||
|
|
||||||
char
|
|
||||||
pin_sim_logic_value(const Pin *pin)
|
|
||||||
{
|
|
||||||
return logicValueString(Sta::sta()->simLogicValue(pin));
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceSeq
|
|
||||||
slow_drivers(int count)
|
|
||||||
{
|
|
||||||
return Sta::sta()->slowDrivers(count);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool
|
|
||||||
timing_role_is_check(TimingRole *role)
|
|
||||||
{
|
|
||||||
return role->isTimingCheck();
|
|
||||||
}
|
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
PinSet
|
|
||||||
find_fanin_pins(PinSeq *to,
|
|
||||||
bool flat,
|
|
||||||
bool startpoints_only,
|
|
||||||
int inst_levels,
|
|
||||||
int pin_levels,
|
|
||||||
bool thru_disabled,
|
|
||||||
bool thru_constants)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
PinSet fanin = sta->findFaninPins(to, flat, startpoints_only,
|
|
||||||
inst_levels, pin_levels,
|
|
||||||
thru_disabled, thru_constants);
|
|
||||||
delete to;
|
|
||||||
return fanin;
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceSet
|
|
||||||
find_fanin_insts(PinSeq *to,
|
|
||||||
bool flat,
|
|
||||||
bool startpoints_only,
|
|
||||||
int inst_levels,
|
|
||||||
int pin_levels,
|
|
||||||
bool thru_disabled,
|
|
||||||
bool thru_constants)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
InstanceSet fanin = sta->findFaninInstances(to, flat, startpoints_only,
|
|
||||||
inst_levels, pin_levels,
|
|
||||||
thru_disabled, thru_constants);
|
|
||||||
delete to;
|
|
||||||
return fanin;
|
|
||||||
}
|
|
||||||
|
|
||||||
PinSet
|
|
||||||
find_fanout_pins(PinSeq *from,
|
|
||||||
bool flat,
|
|
||||||
bool endpoints_only,
|
|
||||||
int inst_levels,
|
|
||||||
int pin_levels,
|
|
||||||
bool thru_disabled,
|
|
||||||
bool thru_constants)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
PinSet fanout = sta->findFanoutPins(from, flat, endpoints_only,
|
|
||||||
inst_levels, pin_levels,
|
|
||||||
thru_disabled, thru_constants);
|
|
||||||
delete from;
|
|
||||||
return fanout;
|
|
||||||
}
|
|
||||||
|
|
||||||
InstanceSet
|
|
||||||
find_fanout_insts(PinSeq *from,
|
|
||||||
bool flat,
|
|
||||||
bool endpoints_only,
|
|
||||||
int inst_levels,
|
|
||||||
int pin_levels,
|
|
||||||
bool thru_disabled,
|
|
||||||
bool thru_constants)
|
|
||||||
{
|
|
||||||
cmdLinkedNetwork();
|
|
||||||
Sta *sta = Sta::sta();
|
|
||||||
InstanceSet fanout = sta->findFanoutInstances(from, flat, endpoints_only,
|
|
||||||
inst_levels, pin_levels,
|
|
||||||
thru_disabled, thru_constants);
|
|
||||||
delete from;
|
|
||||||
return fanout;
|
|
||||||
}
|
|
||||||
|
|
||||||
%} // inline
|
%} // inline
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
//
|
|
||||||
// Object Methods
|
|
||||||
//
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// Local Variables:
|
// Local Variables:
|
||||||
// mode:c++
|
// mode:c++
|
||||||
// End:
|
// End:
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue