def _extract_accessors(node: eve.Node) -> List[gtcpp.GTAccessor]: extents = ( node.iter_tree() .if_isinstance(gtcpp.AccessorRef) .reduceby( (lambda extent, accessor_ref: extent + accessor_ref.offset), "name", init=gtcpp.GTExtent.zero(), as_dict=True, ) ) inout_fields: Set[str] = ( node.iter_tree() .if_isinstance(gtcpp.AssignStmt) .getattr("left") .if_isinstance(gtcpp.AccessorRef) .getattr("name") .to_set() ) return [ gtcpp.GTAccessor( name=name, id=i, intent=gtcpp.Intent.INOUT if name in inout_fields else gtcpp.Intent.IN, extent=extent, ) for i, (name, extent) in enumerate(extents.items()) ]
def _offset_limit(root: Node) -> int: return ( root.iter_tree() .if_isinstance(gtcpp.GTLevel) .getattr("offset") .reduce(lambda state, cur: max(state, abs(cur)), init=0) ) + 1