use of jkind.lustre.builders.NodeBuilder 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.builders.NodeBuilder in project AGREE by loonwerks.
the class RemoveCondacts method clockOutputs.
private Node clockOutputs(Node node, IdExpr clock) {
NodeBuilder builder = new NodeBuilder(node);
builder.clearOutputs();
builder.addLocals(node.outputs);
for (VarDecl output : node.outputs) {
VarDecl dflt = new VarDecl(output.id + namePrefix + "default", output.type);
builder.addInput(dflt);
VarDecl clocked = new VarDecl(output.id + namePrefix + "clocked", output.type);
builder.addOutput(clocked);
// clocked = if clock then output else (default -> pre clocked)
Equation eq = new Equation(new IdExpr(clocked.id), new IfThenElseExpr(clock, new IdExpr(output.id), new BinaryExpr(new IdExpr(dflt.id), BinaryOp.ARROW, new UnaryExpr(UnaryOp.PRE, new IdExpr(clocked.id)))));
builder.addEquation(eq);
}
return builder.build();
}
use of jkind.lustre.builders.NodeBuilder in project AGREE by loonwerks.
the class RemoveCondacts method clockProperties.
private Node clockProperties(Node node, final IdExpr clock) {
NodeBuilder builder = new NodeBuilder(node);
builder.clearProperties();
for (String property : node.properties) {
VarDecl clocked = new VarDecl(property + namePrefix + "clocked_property", NamedType.BOOL);
builder.addLocal(clocked);
// clocked_property = clock => property
builder.addEquation(new Equation(new IdExpr(clocked.id), new BinaryExpr(clock, BinaryOp.IMPLIES, new IdExpr(property))));
builder.addProperty(clocked.id);
}
return builder.build();
}
use of jkind.lustre.builders.NodeBuilder in project AGREE by loonwerks.
the class RemoveCondacts method addClock.
private Node addClock(Node node, IdExpr clock) {
NodeBuilder builder = new NodeBuilder(node);
builder.clearInputs();
builder.addInput(new VarDecl(clock.id, NamedType.BOOL));
builder.addInputs(node.inputs);
return builder.build();
}
use of jkind.lustre.builders.NodeBuilder in project AGREE by loonwerks.
the class RemoveCondacts method clockArrowsAndPres.
private Node clockArrowsAndPres(Node node, final IdExpr clock) {
final VarDecl init = new VarDecl(namePrefix + "init", NamedType.BOOL);
final List<Equation> preEquations = new ArrayList<>();
final List<VarDecl> preLocals = new ArrayList<>();
node = (Node) node.accept(new AstMapVisitor() {
private int counter = 0;
@Override
public Expr visit(BinaryExpr e) {
if (e.op == BinaryOp.ARROW) {
return new IfThenElseExpr(new IdExpr(init.id), e.left.accept(this), e.right.accept(this));
} else {
return super.visit(e);
}
}
@Override
public Expr visit(UnaryExpr e) {
if (e.op == UnaryOp.PRE) {
String state = namePrefix + "state" + counter++;
Type type = e.expr.accept(typeReconstructor);
preLocals.add(new VarDecl(state, type));
// state = if clock then expr else pre state
preEquations.add(new Equation(new IdExpr(state), new IfThenElseExpr(clock, e.expr.accept(this), new UnaryExpr(UnaryOp.PRE, new IdExpr(state)))));
return new UnaryExpr(UnaryOp.PRE, new IdExpr(state));
} else {
return super.visit(e);
}
}
});
NodeBuilder builder = new NodeBuilder(node);
builder.addLocals(preLocals);
builder.addLocal(init);
builder.addEquations(preEquations);
// init = true -> if pre clock then false else pre init
builder.addEquation(new Equation(new IdExpr(init.id), new BinaryExpr(new BoolExpr(true), BinaryOp.ARROW, new IfThenElseExpr(new UnaryExpr(UnaryOp.PRE, clock), new BoolExpr(false), new UnaryExpr(UnaryOp.PRE, new IdExpr(init.id))))));
return builder.build();
}
Aggregations