/ pdkmaster / dispatch / rule.py
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)