coriolis/hurricane/doc/hurricane/PhysicalRule.dox

85 lines
3.9 KiB
Plaintext
Raw Normal View History

Enhanced techno rule support. Inspector support bug fix. * Bug: In Hurricane/Commons.h, modify the getRecord<>() templates so that for both vector<Element> and vector<Element*>, the individual record created for each element are donne with pointers. That is, for the vector<Element> case, we take a pointer. As a general policy, except for the POD types, always use pointers or references to data in the records/inspector. Never uses values that can call the copy constructor. Suppress INSPECTOR_PV_SUPPORT() macro, keep only INSPECTOR_PR_SUPPORT(). Provide value support only for getString<>() template. This value & copy constructor problem was causing a crash when trying to inspect Hurricane::AnalogCellExtension. * New: In Hurricane::Technology, change the API of the PhysicalRule, now we can only create/get PhysicalRule, but setting the value of the rule itself must be done on the rule. Enhance PhysicalRule to provide for stepped rules, non isotropic and ratio rules. Merge TwoLayersPhysicalrule in PhysicalRule, much simpler to suppress the management of derived classes. That means that we loose a little memory as some fields are mutually exclusive. Not a problem considering that there will not be so many of thoses objects. * New: In CRL/helpers.analogtechno.py, enhanced DTR support for rules like: ('minSpacing' , 'metal1', ((0.4,20.0), (0.8,1000.0)), Length, 'REF.1') ('minEnclosure', 'metal1', 'cut1', (0.2,0.3) , Length, 'REF.2') ('minDensity' , 'metal1', 0.30 , Unit , 'REF.3') The DTR parser has been updated, but not the oroshi.dtr Rule cache for analog components. Given a rule name, the value used will be the horizontal one of the first step. * Change: In hurricane/doc/hurricane, re-generate the documentation with updated support for Technology & PhysicalRule.
2020-07-21 04:22:04 -05:00
// -*- C++ -*-
namespace Hurricane {
//! \class PhysicalRule
//! \brief Define a rule for the technology (\b API).
//!
//! \section sPhysicalRuleIntro Introduction
//!
//! The constructor of Physical rule is not directly accessible,
//! as thoses objects must be created only through the
//! Technology class \c API (to be stored in the relevant
//! tables).
//!
//! PhysicalRule is a <em>"one size fit class"</em>. As there will
//! be only a small number of objects created (compare to other
//! kinds) we choose to implement all variant in one class instead
//! of creating a flock of derived classes and all the assorted
//! paraphernalia. As a consequence, not all fields will be used
//! at the same time, they are mutually exclusive.
//! \function bool PhysicalRule::isSymmetric () const;
//! Tells if the rule is symmetric.
//! \function bool PhysicalRule::isDbU () const;
//! Tells if the rule uses physical lengths, with multiple steps
//! or not.
//! \function bool PhysicalRule::isDouble () const;
//! Tells if the rule describe non-length values (Volts, Ohms, Henry,
//! Celsius, ...).
//! \function bool PhysicalRule::hasSteps () const;
//! Tells if the rule has more than one step, that is, is not uniform
//! for all length.
//! \function void PhysicalRule::setSymmetric ( bool state );
//! Set the symmetric state of the rule. This used only for rules
//! bound to two layers.
//! \function void PhysicalRule::addValue ( double value );
//! Set the \c double value of a rule.
//! \function double PhysicalRule::getDoubleValue () const;
//! \return The \c double value of the rule.
//! \function double PhysicalRule::getValue ( DbU::Unit length=0, bool hDir=true ) const;
//! \param length The length for which we want the rule's value.
//! \param hDir In case of non-isotropic rule, which dimension
//! do we want.
//! \return The rule's value for the given length. If no parameter is supplied,
//! then, the X value of the first step is returned.
//! \function void PhysicalRule::addValue ( DbU::Unit value, DbU::Unit maxLength );
//! \param value The \e value of the step to add.
//! \param maxLength The length up to which the rule is valid.
//! passing zero as this argument means always valid.
//!
//! Adds a new stepping value to the rule. If the rules never
//! change, give a \c maxLength of zero and only call this function
//! once on the rule. The rule is isotropic in X and Y.
//!
//! This function can be called multiple time on a rule, each call
//! will add a new step. Steps are defined and ordered according to
//! \c maxLength.
//! \function void PhysicalRule::addValue ( DbU::Unit hvalue, DbU::Unit vvalue, DbU::Unit maxLength );
//! \param hvalue The horizontal \e value of the step to add.
//! \param vvalue The vertical \e value of the step to add.
//! \param maxLength The length up to which the rule is valid.
//! passing zero as this argument means always valid.
//!
//! Adds a new stepping value to the rule. If the rules never
//! change, give a \c maxLength of zero and only call this function
//! once on the rule. The rule is \b not isotropic, it defines a
//! different value for X and Y.
//!
//! This function can be called multiple time on a rule, each call
//! will add a new step. Steps are defined and ordered according to
//! \c maxLength.
}