rule.py
1 # SPDX-License-Identifier: AGPL-3.0-or-later OR GPL-2.0-or-later OR CERN-OHL-S-2.0+ OR Apache-2.0 2 from ..technology import rule as _rle, property_ as _prp, mask as _msk 3 4 5 class RuleDispatcher: 6 """Dispatch to class method based on type of `_Rule` subclasses. 7 8 This dispatcher follows the common way of working in the `dispatch` module. 9 """ 10 def __call__(self, rule: _rle.RuleT, *args, **kwargs): 11 classname = rule.__class__.__name__.split(".")[-1] 12 return getattr(self, classname, self._pd_unhandled)(rule, *args, **kwargs) 13 14 def _pd_unhandled(self, rule, *args, **kwargs): 15 raise RuntimeError( 16 "Internal error: unhandled dispatcher for object of type " 17 f"{rule.__class__.__name__}" 18 ) 19 20 # pdkmaster.technology.rule 21 22 def _Rule(self, rule: _rle.RuleT, *args, **kwargs): 23 raise NotImplementedError( 24 f"No dispatcher implemented for object of type {rule.__class__.__name__}" 25 ) 26 27 def _Condition(self, cond: _rle.ConditionT, *args, **kwargs): 28 return self._Rule(cond, *args, **kwargs) 29 30 # pdkmaster.technology.property_ 31 32 def _Comparison(self, cond: _prp._Comparison, *args, **kwargs): 33 return self._Condition(cond, *args, **kwargs) 34 35 def Greater(self, gt: _prp.Operators.Greater, *args, **kwargs): 36 return self._Comparison(gt, *args, **kwargs) 37 38 def GreaterEqual(self, ge: _prp.Operators.GreaterEqual, *args, **kwargs): 39 return self._Comparison(ge, *args, **kwargs) 40 41 def Smaller(self, st: _prp.Operators.Smaller, *args, **kwargs): 42 return self._Comparison(st, *args, **kwargs) 43 44 def SmallerEqual(self, se: _prp.Operators.SmallerEqual, *args, **kwargs): 45 return self._Comparison(se, *args, **kwargs) 46 47 def Equal(self, eq: _prp.Operators.Equal, *args, **kwargs): 48 return self._Comparison(eq, *args, **kwargs) 49 50 # pdkmaster.technology.mask 51 52 def _MultiMaskCondition(self, cond: _msk._MultiMaskCondition, *args, **kwargs): 53 return self._Condition(cond, *args, **kwargs) 54 55 def _InsideCondition(self, cond: _msk._InsideCondition, *args, **kwargs): 56 return self._MultiMaskCondition(cond, *args, **kwargs) 57 58 def _OutsideCondition(self, cond: _msk._OutsideCondition, *args, **kwargs): 59 return self._MultiMaskCondition(cond, *args, **kwargs) 60 61 def _RuleMask(self, mask: _msk._RuleMask, *args, **kwargs): 62 return self._Rule(mask, *args, **kwargs) 63 64 def DesignMask(self, mask: _msk.DesignMask, *args, **kwargs): 65 return self._RuleMask(mask, *args, **kwargs) 66 67 def _MaskAlias(self, alias: _msk._MaskAlias, *args, **kwargs): 68 return self._RuleMask(alias, *args, **kwargs) 69 70 def Connect(self, conn: _msk.Connect, *args, **kwargs): 71 return self._Rule(conn, *args, **kwargs)