diff --git a/liberty/LibertyBuilder.cc b/liberty/LibertyBuilder.cc index 4f57805b..2d4b4a70 100644 --- a/liberty/LibertyBuilder.cc +++ b/liberty/LibertyBuilder.cc @@ -692,10 +692,10 @@ LibertyBuilder::makeMinPulseWidthArcs(LibertyCell *cell, from_port = to_port; TimingArcSet *arc_set = makeTimingArcSet(cell, from_port, to_port, related_out, role, attrs); - for (auto to_rf : RiseFall::range()) { - TimingModel *model = attrs->model(to_rf); + for (const RiseFall *from_rf : RiseFall::range()) { + TimingModel *model = attrs->model(from_rf); if (model) - makeTimingArc(arc_set, to_rf->opposite(), to_rf, model); + makeTimingArc(arc_set, from_rf, from_rf->opposite(), model); } return arc_set; } diff --git a/liberty/LibertyReader.cc b/liberty/LibertyReader.cc index 3c223fa4..e9aa2c35 100644 --- a/liberty/LibertyReader.cc +++ b/liberty/LibertyReader.cc @@ -2027,8 +2027,8 @@ LibertyReader::makeMinPulseWidthArcs(LibertyPort *port, attrs = make_shared(); attrs->setTimingType(TimingType::min_pulse_width); } - // rise/fall_constraint model is on the trailing edge of the pulse. - const RiseFall *model_rf = hi_low->opposite(); + // rise/fall_constraint model is on the leading edge of the pulse. + const RiseFall *model_rf = hi_low; TimingModel *check_model = makeScalarCheckModel(min_width, ScaleFactorType::min_pulse_width, model_rf); attrs->setModel(model_rf, check_model); diff --git a/liberty/LibertyWriter.cc b/liberty/LibertyWriter.cc index 4d7cb6c2..e3d31312 100644 --- a/liberty/LibertyWriter.cc +++ b/liberty/LibertyWriter.cc @@ -426,8 +426,13 @@ LibertyWriter::writeTimingArcSet(const TimingArcSet *arc_set) for (const RiseFall *rf : RiseFall::range()) { TimingArc *arc = arc_set->arcTo(rf); - if (arc) - writeTimingModels(arc, rf); + if (arc) { + // Min pulse width arcs are wrt to the leading edge of the pulse. + const RiseFall *model_rf = (arc_set->role() == TimingRole::width()) + ? rf->opposite() + : rf; + writeTimingModels(arc, model_rf); + } } fprintf(stream_, " }\n");