void modify_branch_so_that_state_access_is_indexed(Branch* branch, int index) { Term* stateInput = find_state_input(branch); if (stateInput == NULL) return; // If the state output is connected directly to state input, then do nothing. Term* stateOutput = find_state_output(branch); if (stateOutput->input(0) == stateInput) return; Term* unpackList = apply(branch, FUNCS.unpack_state_from_list, TermList(stateInput)); unpackList->setIntProp("index", index); move_after_inputs(unpackList); for (int i=0; i < stateInput->users.length(); i++) { Term* term = stateInput->users[i]; if (term == unpackList) continue; remap_pointers_quick(term, stateInput, unpackList); } Term* stateResult = stateOutput->input(0); ca_assert(stateResult != NULL); Term* packList = apply(branch, FUNCS.pack_state_to_list, TermList(stateInput, stateResult)); packList->setIntProp("index", index); packList->setBoolProp("final", true); set_input(stateOutput, 0, packList); move_after(packList, stateResult); }
void if_block_create_input_placeholders_for_outer_pointers(Term* ifCall) { Branch* contents = nested_contents(ifCall); TermList outerTerms; // Find outer pointers across each case for (CaseIterator it(contents); it.unfinished(); it.advance()) { list_outer_pointers(nested_contents(it.current()), &outerTerms); } ca_assert(ifCall->numInputs() == 0); // Create input placeholders and add inputs for all outer pointers for (int i=0; i < outerTerms.length(); i++) { Term* outer = outerTerms[i]; set_input(ifCall, i, outer); Term* placeholder = append_input_placeholder(nested_contents(ifCall)); rename(placeholder, outer->name); // Go through each case and repoint to this new placeholder for (CaseIterator it(contents); it.unfinished(); it.advance()) { remap_pointers_quick(nested_contents(it.current()), outer, placeholder); } } }
void add_implicit_placeholders(Term* forTerm) { Branch* contents = nested_contents(forTerm); std::string listName = forTerm->input(0)->name; Term* iterator = for_loop_get_iterator(contents); std::string iteratorName = iterator->name; std::vector<std::string> reboundNames; list_names_that_this_branch_rebinds(contents, reboundNames); int inputIndex = 1; for (size_t i=0; i < reboundNames.size(); i++) { std::string const& name = reboundNames[i]; if (name == listName) continue; if (name == iteratorName) continue; Term* original = find_name_at(forTerm, name.c_str()); // The name might not be found, for certain parser errors. if (original == NULL) continue; Term* result = contents->get(name); // Create input_placeholder Term* input = apply(contents, FUNCS.input, TermList(), name_from_string(name)); Type* type = find_common_type(original->type, result->type); change_declared_type(input, type); contents->move(input, inputIndex); set_input(forTerm, inputIndex, original); // Repoint terms to use our new input_placeholder for (BranchIterator it(contents); it.unfinished(); it.advance()) remap_pointers_quick(*it, original, input); // Create output_placeholder Term* term = apply(contents, FUNCS.output, TermList(result), name_from_string(name)); // Move output into the correct output slot contents->move(term, contents->length() - 1 - inputIndex); inputIndex++; } }