1"""Primitive types from System C and C++""" 
    8    Type context provides a way to contextualize types, enabling generation of input ports and output ports 
   10    def __init__(self, prefix=None, suffix=None, sep=None):
 
 
   17        if this 
is None and that 
is not None:
 
   19        elif this 
is not None and that 
is None:
 
   21        elif this 
is None and that 
is None:
 
 
   27        """merges fields of two contexts, throws error if both fields are non None""" 
   29            return copy.copy(self)
 
   30        prefix = TypeContext.merge_field_default_this(self.
prefix, that.prefix)
 
   31        suffix = TypeContext.merge_field_default_this(self.
suffix, that.suffix)
 
   32        sep = TypeContext.merge_field_default_this(self.
sep, that.sep)
 
   33        return TypeContext(prefix=prefix, suffix=suffix, sep=sep)
 
 
 
   39    handles automatically subclass registration for primitive types 
   41    primitive_type_names = []
 
   42    name_mapping = { 
'_Bool': 
'cppbool', 
'bool': 
'cppbool', 
'unsigned_int': 
'cppuint', 
'int': 
'cppint', 
'unsigned_short': 
'cppushort', 
'short': 
'cppshort',
 
   43                     'char': 
'cppchar', 
'unsigned_char': 
'cppunsignedchar', 
'signed_char': 
'cppsignedchar', 
'long_long': 
'cpplonglong', 
'unsigned_long_long': 
'cppulonglong'}
 
   46        """registers subclass automatically""" 
 
   52        """convert the primitive name string -> type to a dict""" 
   53        return dict(zip(map(
lambda x: x.__name__, Primitive.primitive_type_names), Primitive.primitive_type_names))
 
 
   57        """get the primitive type of name""" 
   58        type_dict = Primitive.get_primitive_name_dict()
 
   59        name = Primitive.name_filter(name)
 
   61            return type_dict[name]
 
 
   67        """maps type name to internal name""" 
   68        if name 
in Primitive.name_mapping:
 
   69            return Primitive.name_mapping[name]
 
 
 
   85    def to_str(self, var_name, context=None):
 
   86        input_context = 
TypeContext(prefix=
'input', suffix=
',').update_not_none(context)
 
   87        return self.
T.
to_str(var_name=var_name, context=input_context)
 
 
 
   97    def to_str(self, var_name, context=None):
 
   98        input_context = 
TypeContext(prefix=
'inout', suffix=
',').update_not_none(context)
 
   99        return self.
T.
to_str(var_name=var_name, context=input_context)
 
 
 
  105    def to_str(self, var_name, context=None):
 
  106        output_context = 
TypeContext(prefix=
'output', suffix=
',')  
 
  107        input_context = 
TypeContext(prefix=
'input', suffix=
',')  
 
  109        res = self.
T.
to_str(var_name + 
'_data', context=output_context)
 
 
 
  122    def to_str(self, var_name, context=None):
 
  123        output_context = 
TypeContext(prefix=
'output', suffix=
',')  
 
  124        input_context = 
TypeContext(prefix=
'input', suffix=
',')  
 
  126        res = self.
T.
to_str(var_name + 
'_data', context=input_context)
 
 
 
  139    def to_str(self, var_name, context=None):
 
  140        output_context = 
TypeContext(prefix=
'output', suffix=
',').update_not_none(context)
 
  141        return self.
T.
to_str(var_name=var_name, context=output_context)
 
 
 
  148    def to_str(self, var_name, context=None):
 
  152            if context.prefix 
is not None:
 
  153                prefix = context.prefix + 
' ' 
  154            if context.suffix 
is not None:
 
  155                suffix = context.suffix
 
  157            return f
'{prefix}logic [{self.width-1}:0] {var_name}{suffix}' 
  159            return f
'{prefix}logic [{self.width-1}:0]' 
 
 
  165    def to_str(self, var_name, context=None):
 
  169            if context.prefix 
is not None:
 
  170                prefix = context.prefix + 
' ' 
  171            if context.suffix 
is not None:
 
  172                suffix = context.suffix
 
  174            return f
'{prefix}logic [{self.width-1}:0] {var_name}{suffix}' 
  176            return f
'{prefix}logic [{self.width-1}:0]' 
 
 
  182    def to_str(self, var_name, context=None):
 
  186            if context.prefix 
is not None:
 
  187                prefix = context.prefix + 
' ' 
  188            if context.suffix 
is not None:
 
  189                suffix = context.suffix
 
  191            return f
'{prefix}logic signed[{self.width-1}:0] {var_name}{suffix}' 
  193            return f
'{prefix}logic signed[{self.width-1}:0]' 
 
 
  202        warnings.warn(
'double detected, currently treated as integer')
 
 
 
  228            raise ValueError(
'Void type can only be used in function return types and should not have name')
 
 
 
  236    def to_str(self, var_name, context=None):
 
  237        return self.
T.
to_str(var_name, context)
 
 
 
  245        if isinstance(self.
T, array):
 
 
  250    def to_str(self, var_name, context=None):
 
  251        sz_str = 
''.join([
'[0:{}]'.format(sz - 1) 
for sz 
in self.
sz])
 
  252        return self.
T.
to_str(
'{}{}'.format(var_name, sz_str), context)
 
 
 
  305    def to_str(self, var_name, context=None):
 
  306        warnings.warn(
'port binding not fully implemented')
 
  307        binding_str = 
',\n'.join(f
'.{b[0]}({b[1]})' for b 
in self.
port_bindings)
 
  308        return f
'{self.type_name} {var_name}(\n{binding_str}\n/* port bindings not fully implemented */);' 
 
 
__init_subclass__(cls, **kwargs)
 
get_primitive_name_dict()
 
list primitive_type_names
 
update_not_none(self, that)
 
__init__(self, prefix=None, suffix=None, sep=None)
 
merge_field_default_this(this, that)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
to_str(self, var_name, context=None)
 
__init__(self, type_name, port_bindings=None)