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)