def expandToFuncApp(lib: FnLibrary, term: PPTerm, ntId: int, fname: str) -> Optional[PPTerm]: resTerm = None # Not needed now as there are no lambda terms # libItem = ScopeUtils.getAVarInScope(lib, term, ntId, fname) libItem = lib.getWithLibPrefix(fname) assert libItem nt = ASTUtils.getNthNT(term, ntId) libItem = alphaConvertLibItem(libItem, term) # TODO: expandToVar passed nt.sort as second argument subst = unifyOne(nt.sort, libItem.sort.rtpe) if not gUseTypes: if subst is None: subst = [] if subst is not None: nts = [PPTermNT('Z', arg_sort) for arg_sort in libItem.sort.args] fnApp = PPFuncApp(PPVar(libItem.name), nts) termUnified = applySubst(subst, term) fnAppUnified = applySubst(subst, fnApp) resTerm = ReprUtils.replaceNthNT(termUnified, ntId, fnAppUnified) return resTerm
def expandToUnk(term: PPTerm, ntId: int) -> Optional[PPTerm]: """ Generate a new term by replacing a "ntId"th NT from a "term" with a PPTermUnk """ nt = ASTUtils.getNthNT(term, ntId) # Avoid generating Unk of type PPDimConst, PPDimVar, PPEumSort, or PPInt() if isinstance(nt.sort, PPDimConst) or isinstance(nt.sort, PPDimVar) or isinstance(nt.sort, PPEnumSort) or \ isinstance(nt.sort, PPInt): return None unk = ASTDSL.mkUnk(nt.sort) # subst = unifyOne(unk.sort, nt.sort) # # if subst != []: # print("non empty subst") # # termExpanded = None # if subst is not None: # termUnified = applySubst(subst, term) # termExpanded = ReprUtils.replaceNthNT(termUnified, ntId, unk) termNew = ReprUtils.replaceNthNT(term, ntId, unk) return termNew
def expandDimConst(term: PPTerm, ntId: int) -> Optional[PPTerm]: """ Expand dimension constant to integer constants (Required for fold zeros) """ nt = ASTUtils.getNthNT(term, ntId) if type(nt.sort) != PPDimConst: return None subTerm = PPIntConst(nt.sort.value) termExpanded = ReprUtils.replaceNthNT(term, ntId, subTerm) return termExpanded
def applyExpandEnum(lib: FnLibrary, term: PPTerm, ntId: int) -> List[PPTerm]: res = [] nt = ASTUtils.getNthNT(term, ntId) if type(nt.sort) != PPEnumSort: return res for i in range(nt.sort.start, nt.sort.end + 1): subTerm = PPIntConst(i) nxtTerm = expandEnum(term, ntId, subTerm) if nxtTerm is not None: res.append(nxtTerm) return res
def expandToVar(lib: FnLibrary, term: PPTerm, ntId: int, vname: str) -> Optional[PPTerm]: """ Generate a new term by replacing a "ntId"th NT from a "term" with a variable (in scope) with name "fname" """ nt = ASTUtils.getNthNT(term, ntId) # libItem = ScopeUtils.getAVarInScope(lib, term, ntId, vname) libItem = lib.getWithLibPrefix(vname) assert libItem libItem = alphaConvertLibItem(libItem, term) subst = unifyOne(libItem.sort, nt.sort) if not gUseTypes: if subst is None: subst = [] termExpanded = None if subst is not None: termUnified = applySubst(subst, term) termExpanded = ReprUtils.replaceNthNT(termUnified, ntId, PPVar(libItem.name)) return termExpanded
def expandEnum(term: PPTerm, ntId: int, subTerm: PPTerm) -> Optional[PPTerm]: nt = ASTUtils.getNthNT(term, ntId) termExpanded = ReprUtils.replaceNthNT(term, ntId, subTerm) return termExpanded