Source code for hdlConvertorAst.to.hdlUtils

from hdlConvertorAst.hdlAst._expr import HdlValueInt


[docs]class Indent(object): """ indentation context """
[docs] def __init__(self, autoIndentStream): self.s = autoIndentStream self.original_indent = None
def __enter__(self): s = self.s self.original_indent = s.indent_str s.indent_cnt += 1 s.indent_str = s.indent_str + s.INDENT_STEP def __exit__(self, exception_type, exception_value, traceback): s = self.s s.indent_cnt -= 1 s.indent_str = self.original_indent
[docs]class UnIndent(): """ unindentation context """
[docs] def __init__(self, autoIndentStream): self.s = autoIndentStream self.original_indent = None
def __enter__(self): s = self.s self.original_indent = s.indent_str assert s.indent_cnt > 0 s.indent_cnt -= 1 s.indent_str = s.indent_str[0:len(s.indent_str) - len(s.INDENT_STEP)] def __exit__(self, exception_type, exception_value, traceback): s = self.s s.indent_cnt += 1 s.indent_str = self.original_indent
[docs]class AutoIndentingStream():
[docs] def __init__(self, stream, indent_step): """ :param stream: output stream :param indent_step: string of indent """ self.INDENT_STEP = indent_step self.stream = stream self.requires_indent = True self.indent_cnt = 0 self.indent_str = ""
[docs] def write(self, s): w = self.stream.write if self.requires_indent and s != "\n": w(self.indent_str) w(s) self.requires_indent = s.endswith("\n")
[docs] def close(self): self.stream.close()
[docs]def iter_with_last(it): # Ensure it's an iterator and get the first field it = iter(it) try: prev = next(it) except StopIteration: return for item in it: # Lag by one item so I know I'm not at the end yield False, prev prev = item # Last item yield True, prev
[docs]def bit_string(v, width, vld_mask=None): """ :type v: int :type width: int :type vld_mask: Optional[int] :param v: integer value of bitstring :param widht: number of bits in value :param vld_mask: mask which has 1 for every valid bit in value :return: HdlValueInt """ all_mask = (1 << width) - 1 if vld_mask is None: vld_mask = all_mask # if vld_mask == 0: # if width % 4 == 0: # base = 16 # bit_string = "".join(["x" for _ in range(width//4)]) # else: # base = 2 # bit_string = "".join(["x" for _ in range(width)]) elif width % 4 == 0 and vld_mask == (1 << width) - 1: # hex full valid base = 16 bit_string = ("%0" + str(width // 4) + 'x') % (v) else: # binary base = 2 buff = [] for i in range(width - 1, -1, -1): mask = (1 << i) b = v & mask if vld_mask & mask: s = "1" if b else "0" else: s = "x" buff.append(s) bit_string = "".join(buff) return HdlValueInt(bit_string, width, base)