/ pdkmaster / dispatch / mask.py
mask.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 mask as _msk, wafer_ as _wfr
 3  
 4  
 5  class MaskDispatcher:
 6      """Dispatch to class method based on type of `_Mask` subclasses.
 7  
 8      This dispatcher follows the common way of working in the `dispatch` module.
 9      """
10      def __call__(self, mask: _msk.MaskT, *args, **kwargs):
11          classname = mask.__class__.__name__.split(".")[-1]
12          return getattr(self, classname, self._pd_unhandled)(mask, *args, **kwargs)
13  
14      def _pd_unhandled(self, mask, *args, **kwargs):
15          raise RuntimeError(
16              "Internal error: unhandled dispatcher for object of type "
17              f"{mask.__class__.__name__}"
18          )
19  
20      def _Mask(self, mask: _msk.MaskT, *args, **kwargs):
21          raise NotImplementedError(
22              f"No dispatcher implemented for object of type {mask.__class__.__name__}"
23          )
24  
25      def _RuleMask(self, mask: _msk._RuleMask, *args, **kwargs):
26          return self._Mask(mask, *args, **kwargs)
27  
28      def DesignMask(self, mask: _msk.DesignMask, *args, **kwargs):
29          return self._RuleMask(mask, *args, **kwargs)
30  
31      def _PartsWith(self, pw: _msk._PartsWith, *args, **kwargs):
32          return self._Mask(pw, *args, **kwargs)
33  
34      def Join(self, join: _msk.Join, *args, **kwargs):
35          return self._Mask(join, *args, **kwargs)
36  
37      def Intersect(self, intersect: _msk.Intersect, *args, **kwargs):
38          return self._Mask(intersect, *args, **kwargs)
39  
40      def _MaskRemove(self, mr: _msk._MaskRemove, *args, **kwargs):
41          return self._Mask(mr, *args, **kwargs)
42  
43      def _MaskAlias(self, mask: _msk._MaskAlias, *args, **kwargs):
44          return self._RuleMask(mask, *args, **kwargs)
45  
46      def _SameNet(self, same: _msk._SameNet, *args, **kwargs):
47          return self._Mask(same, *args, **kwargs)
48  
49      def _Wafer(self, wafer: _wfr._Wafer, *args, **kwargs):
50          return self._Mask(wafer, *args, **kwargs)