AstNodePtr SymbolicFunction :: CodeGen( AstInterface &_fa) const { AstInterface::AstNodeList l; for (const_iterator i = args.begin(); i != args.end(); ++i) { SymbolicVal cur = *i; AstNodePtr curast = cur.CodeGen(_fa); l.push_back(curast); } if (t == AstInterface::OP_NONE) { return _fa.CreateFunctionCall( op, l); } else if (t == AstInterface::OP_ARRAY_ACCESS) { AstNodePtr arr = l.front(); l.pop_front(); return _fa.CreateArrayAccess(arr, l); } else if (t == AstInterface::OP_ASSIGN && l.size() == 2) { return _fa.CreateAssignment(l.front(), l.back()); } else if (l.size() == 2) return _fa.CreateBinaryOP( t, l.front(), l.back()); else { assert(l.size() == 1); return _fa.CreateUnaryOP( t, l.front()); } }
AstNodePtr SymbolicSelect:: CodeGen( AstInterface &fa ) const { int size = 0; AstInterface::AstNodeList list; for (OpdIterator iter = GetOpdIterator(); !iter.ReachEnd(); iter.Advance()) { AstNodePtr p = Term2Val(iter.Current()).CodeGen(fa); list.push_back(p); ++size; } assert( size > 1); std::string func = (opt< 0)? "min" : "max"; return fa.CreateFunctionCall(func, list); }
AstNodePtr ArrayUseAccessFunction:: CreateArrayAccess( AstInterface& fa, const AstNodePtr& arr, AstInterface::AstNodeList& index) { if (prev != 0) return prev->CreateArrayAccess(fa, arr, index); if (index.size() > 1) { AstInterface::AstNodeList tmp = index; tmp.push_front(arr); return fa.CreateFunctionCall(funcname, tmp); } else return fa.CreateArrayAccess(arr, index); }
AstNodePtr ArrayUseAccessFunction:: CreateArrayAccess( AstInterface& fa, const AstNodePtr& arr, const AstNodeList& index) { AstNodePtr r; if (prev != 0) r = prev->CreateArrayAccess(fa, arr, index); if (r == AST_NULL) { AstNodeList nindex; nindex.push_back(arr.get_ptr()); for (AstNodeList::const_iterator p = index.begin(); p != index.end(); ++p) nindex.push_back(*p); r = fa.CreateFunctionCall(funcname,nindex.begin(), nindex.end()) ; } return r; }