use of jkind.lustre.Node in project AGREE by loonwerks.
the class InlineNodeCalls method transform.
public static SimulationProgram transform(final SimulationProgram program) {
final Program lustreProgram = program.getLustreProgram();
final InlineNodeCalls inliner = new InlineNodeCalls(Util.getNodeTable(lustreProgram.nodes));
Node main = lustreProgram.getMainNode();
// Build a single node that contains the result of inlining of all node calls
final NodeBuilder nodeBuilder = new NodeBuilder(main);
nodeBuilder.clearAssertions();
nodeBuilder.addAssertions(inliner.visitExprs(main.assertions));
nodeBuilder.clearEquations();
nodeBuilder.addEquations(inliner.visitEquationsQueue(main.equations));
nodeBuilder.addLocals(inliner.newLocals);
nodeBuilder.addProperties(inliner.newProperties);
// Build a new program
final ProgramBuilder programBuilder = new ProgramBuilder(lustreProgram);
programBuilder.clearNodes();
programBuilder.addNode(nodeBuilder.build());
// Build the simulation program
final SimulationProgramBuilder simulationProgramBuilder = new SimulationProgramBuilder(program);
simulationProgramBuilder.setLustreProgram(programBuilder.build());
return simulationProgramBuilder.build();
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class InlineNodeCalls method visitNodeCallExpr.
public List<IdExpr> visitNodeCallExpr(NodeCallExpr e) {
String prefix = newPrefix(e.node);
Node node = nodeTable.get(getOriginalName(e));
Map<String, IdExpr> translation = getTranslation(prefix, node);
createInputEquations(node.inputs, e.args, translation);
createAssignmentEquations(prefix, node.equations, translation);
accumulateProperties(node.properties, translation);
List<IdExpr> result = new ArrayList<>();
for (VarDecl decl : node.outputs) {
result.add(translation.get(decl.id));
}
return result;
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class RemoveCondacts method clockNodeCalls.
private Node clockNodeCalls(Node node, final IdExpr clock) {
return (Node) node.accept(new AstMapVisitor() {
@Override
public Expr visit(NodeCallExpr e) {
List<Expr> args = new ArrayList<>();
args.add(clock);
args.addAll(visitExprs(e.args));
Node clocked = createClockedNode(e.node);
return new NodeCallExpr(clocked.id, args);
}
@Override
public Expr visit(CondactExpr e) {
NodeCallExpr call = (NodeCallExpr) super.visit(e.call);
List<Expr> args = new ArrayList<>();
args.add(new BinaryExpr(e.clock.accept(this), BinaryOp.AND, clock));
args.addAll(e.call.args);
args.addAll(visitExprs(e.args));
Node condact = createCondactNode(call.node);
return new NodeCallExpr(condact.id, args);
}
});
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class RemoveCondacts method createClockedNode.
private Node createClockedNode(String id) {
String condactId = id + namePrefix + "clocked";
if (nodeTable.containsKey(condactId)) {
return nodeTable.get(condactId);
}
Node node = nodeTable.get(id);
typeReconstructor.setNodeContext(node);
IdExpr clock = new IdExpr(namePrefix + "clock");
node = addClock(node, clock);
node = clockArrowsAndPres(node, clock);
// Because this is for a node call within a condact, we do not need to
// clock the outputs. The outer condact will ignore outputs when the
// clock is false.
node = clockNodeCalls(node, clock);
node = clockProperties(node, clock);
node = renameNode(node, condactId);
nodeTable.put(node.id, node);
resultNodes.add(node);
return node;
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class RemoveCondacts method removeCondacts.
private Node removeCondacts(Node node) {
return (Node) node.accept(new AstMapVisitor() {
@Override
public Expr visit(CondactExpr e) {
NodeCallExpr call = (NodeCallExpr) e.call.accept(this);
List<Expr> args = new ArrayList<>();
args.add(e.clock.accept(this));
args.addAll(e.call.args);
args.addAll(visitExprs(e.args));
Node condact = createCondactNode(call.node);
return new NodeCallExpr(condact.id, args);
}
});
}
Aggregations