Added structural description
This commit is contained in:
		| @@ -111,8 +111,7 @@ def _pythonizor(klass, name): | ||||
|  | ||||
| # install the pythonizor as a callback on namespace 'Math' (default is the global namespace) | ||||
| cppyy.py.add_pythonization(_pythonizor, 'sc_core') | ||||
|  | ||||
|  | ||||
|      | ||||
| # reflection methods | ||||
| def get_members(sc_object): | ||||
|     def is_cpp_data_type(name, module): | ||||
|   | ||||
							
								
								
									
										81
									
								
								pysysc/structural.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										81
									
								
								pysysc/structural.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,81 @@ | ||||
| ''' | ||||
| Created on 02.01.2019 | ||||
|  | ||||
| @author: eyck | ||||
| ''' | ||||
| from cppyy import gbl as cpp | ||||
| from builtins import getattr | ||||
| import re | ||||
|  | ||||
| class Module(object): | ||||
|     ''' | ||||
|     classdocs | ||||
|     ''' | ||||
|  | ||||
|     def __init__(self, clazz): | ||||
|         self.cppclazz=clazz | ||||
|         self.instance=None | ||||
|      | ||||
|     def __getattr__(self, attr): | ||||
|         if self.instance is None: | ||||
|             raise AttributeError | ||||
|         return getattr(self.instance, attr) | ||||
|      | ||||
|     def create(self, name): | ||||
|         self.instance = self.cppclazz(cpp.sc_core.sc_module_name(str(name))) | ||||
|         return self | ||||
|  | ||||
| class Signal(object): | ||||
|     ''' | ||||
|     classdocs | ||||
|     ''' | ||||
|  | ||||
|     _sc_inout_re = re.compile(r'^sc_core::sc_(?:_in)?out<(.*)>$') | ||||
|     _sc_port_re = re.compile(r'^sc_core::sc_port<[^<]*<(.*)>>$') | ||||
|  | ||||
|  | ||||
|     def __init__(self, name=None): | ||||
|         self.name=name | ||||
|         self.source=None | ||||
|         self.targets=[] | ||||
|         self.signal=None | ||||
|         self.sig_data_type=None | ||||
|          | ||||
|     def src(self, module_port): | ||||
|         self.source=module_port | ||||
|         port_class_name=type(module_port).__cppname__ | ||||
|         match = self._sc_inout_re.match(port_class_name) | ||||
|         if match: | ||||
|             self.sig_data_type=match.group(1) | ||||
|         else: | ||||
|             match = self._sc_port_re.match(port_class_name) | ||||
|             if match: | ||||
|                 self.sig_data_type=match.group(1) | ||||
|         if self.sig_data_type is None: | ||||
|             raise AttributeError; | ||||
|         py_dt_name=self.sig_data_type.replace("::", ".").replace("<", "[").replace(">", "]") | ||||
|         self.signal = eval("cpp.sc_core.sc_signal[cpp.%s](self.name)" % py_dt_name) | ||||
|         module_port.bind(self.signal) | ||||
|         return self | ||||
|      | ||||
|     def sink(self, module_port): | ||||
|         self.targets.append(module_port) | ||||
|         module_port.bind(self.signal) | ||||
|         return self | ||||
|          | ||||
| class Connection(object): | ||||
|     ''' | ||||
|     classdocs | ||||
|     ''' | ||||
|     def __init__(self): | ||||
|         self.source=None | ||||
|         self.targets=[] | ||||
|      | ||||
|     def src(self, module_port): | ||||
|         self.source=module_port | ||||
|         return self | ||||
|      | ||||
|     def sink(self, module_port): | ||||
|         self.targets.append(module_port) | ||||
|         self.source.bind(module_port) | ||||
|         return self | ||||
		Reference in New Issue
	
	Block a user