def walkFlatten(self, offset: int=<NUM_LIT:0>,<EOL>shouldEnterFn=_default_shouldEnterFn,<EOL>otherObjItCtx: ObjIteratorCtx =_DummyIteratorCtx()<EOL>) -> Generator[<EOL>Union[Tuple[Tuple[int, int], '<STR_LIT>'], '<STR_LIT>'],<EOL>None, None]:
t = self.dtype<EOL>base = self.bitAddr + offset<EOL>end = self.bitAddrEnd + offset<EOL>shouldEnter, shouldYield = shouldEnterFn(self)<EOL>if shouldYield:<EOL><INDENT>yield ((base, end), self)<EOL><DEDENT>if shouldEnter:<EOL><INDENT>if isinstance(t, Bits):<EOL><INDENT>pass<EOL><DEDENT>elif isinstance(t, HStruct):<EOL><INDENT>for ch in self.children:<EOL><INDENT>with otherObjItCtx(ch.origin.name):<EOL><INDENT>yield from ch.walkFlatten(<EOL>offset,<EOL>shouldEnterFn,<EOL>otherObjItCtx)<EOL><DEDENT><DEDENT><DEDENT>elif isinstance(t, HArray):<EOL><INDENT>itemSize = (self.bitAddrEnd - self.bitAddr) // self.itemCnt<EOL>for i in range(self.itemCnt):<EOL><INDENT>with otherObjItCtx(i):<EOL><INDENT>yield from self.children.walkFlatten(<EOL>base + i * itemSize,<EOL>shouldEnterFn,<EOL>otherObjItCtx)<EOL><DEDENT><DEDENT><DEDENT>elif isinstance(t, HUnion):<EOL><INDENT>yield OneOfTransaction(self, offset, shouldEnterFn,<EOL>self.children)<EOL><DEDENT>elif isinstance(t, HStream):<EOL><INDENT>assert len(self.children) == <NUM_LIT:1><EOL>yield StreamTransaction(self, offset, shouldEnterFn,<EOL>self.children[<NUM_LIT:0>])<EOL><DEDENT>else:<EOL><INDENT>raise TypeError(t)<EOL><DEDENT><DEDENT>
Walk fields in instance of TransTmpl

:param offset: optional offset for all children in this TransTmpl
:param shouldEnterFn: function (transTmpl) which returns True
    when field should be split on it's children
:param shouldEnterFn: function(transTmpl) which should return
    (shouldEnter, shouldUse) where shouldEnter is flag that means
    iterator should look inside of this actual object
    and shouldUse flag means that this field should be used
    (=generator should yield it)
:return: generator of tuples ((startBitAddress, endBitAddress),
    TransTmpl instance)