17 return "TestStructuralOperation";
20std::unique_ptr<Operation>
23 return std::make_unique<TestStructuralOperation>(*
this);
43 if (
const auto input = argument->input())
57 auto newInputVar = node->addArguments(argument->Type());
82 if (
const auto output = result->output())
129 if (argument->input() ==
inputVar.input)
131 inputVar.argument.push_back(argument);
151 if (result->output() ==
outputVar.output)
171 util::assertedCast<StructuralInput>(
inputVar.input),
173 inputVar.argument.push_back(argument);
183 throw std::out_of_range(
"Invalid input index.");
186 for (
auto & argument :
in->arguments)
188 argument.region()->RemoveArguments({ argument.index() });
204 return {
nullptr, std::move(
arguments) };
210 return *
addInput(std::make_unique<StructuralInput>(
this, &origin, origin.
Type()),
true);
216 return *
addOutput(std::make_unique<StructuralOutput>(
this, std::move(type)));
223 throw util::Error(
"Insufficient number of origins.");
233 util::assertedCast<StructuralOutput>(
outputVar.output),
245 throw std::out_of_range(
"Invalid output index.");
248 for (
auto & result :
out->results)
250 result.region()->RemoveResults({ result.index() });
260 throw util::Error(
"Insufficient number of origins.");
263 std::vector<RegionResult *> results;
268 results.push_back(result);
271 return {
nullptr, std::move(results) };
util::HashSet< rvsdg::Output * > arguments
size_t RemoveInputs(const util::HashSet< size_t > &indices)
size_t ninputs() const noexcept
size_t noutputs() const noexcept
size_t RemoveOutputs(const util::HashSet< size_t > &indices)
size_t index() const noexcept
const std::shared_ptr< const rvsdg::Type > & Type() const noexcept
static RegionArgument & Create(rvsdg::Region ®ion, StructuralInput *input, std::shared_ptr< const rvsdg::Type > type)
Creates region entry argument.
static RegionResult & Create(rvsdg::Region ®ion, rvsdg::Output &origin, StructuralOutput *output, std::shared_ptr< const rvsdg::Type > type)
Create region exit result.
Represent acyclic RVSDG subgraphs.
RegionArgument * argument(size_t index) const noexcept
RegionArgumentRange Arguments() noexcept
void copy(Region *target, SubstitutionMap &smap) const
Copy a region with substitutions.
size_t nresults() const noexcept
RegionResult * result(size_t index) const noexcept
size_t index() const noexcept
size_t narguments() const noexcept
RegionResultRange Results() noexcept
StructuralInput * addInput(std::unique_ptr< StructuralInput > input, bool notifyRegion)
StructuralOutput * addOutput(std::unique_ptr< StructuralOutput > input)
SubregionIteratorRange Subregions()
rvsdg::Region * subregion(size_t index) const noexcept
size_t nsubregions() const noexcept
StructuralOutput * output(size_t index) const noexcept
StructuralInput * input(size_t index) const noexcept
void removeInputAndArguments(size_t index)
OutputVar addOutputWithResults(const std::vector< Output * > &origins)
InputVar addInputWithArguments(Output &origin)
OutputVar mapOutput(const Output &output) const
~TestStructuralNode() noexcept override
OutputVar addResults(const std::vector< Output * > &origins)
InputVar mapInput(const Input &input) const
void removeOutputAndResults(size_t index)
StructuralOutput & addOutputOnly(std::shared_ptr< const Type > type)
InputVar addArguments(const std::shared_ptr< const Type > &type)
static TestStructuralNode * create(Region *parent, const size_t numSubregions)
TestStructuralNode * copy(Region *region, SubstitutionMap &smap) const override
Copy a node with substitutions.
StructuralInput & addInputOnly(Output &origin)
std::unique_ptr< Operation > copy() const override
~TestStructuralOperation() noexcept override
NodeType * TryGetOwnerNode(const rvsdg::Input &input) noexcept
Checks if this is an input to a node of specified type.
A variable routed out of a TestStructuralNode.
StructuralOutput * output