use of jkind.lustre.Program 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.Program in project AGREE by loonwerks.
the class RemoveProperties method transform.
public static SimulationProgram transform(final SimulationProgram program) {
final Program lustreProgram = program.getLustreProgram();
if (lustreProgram.nodes.size() != 1) {
throw new IllegalArgumentException("Only lustre programs with exactly one node are supported");
}
final SimulationProgramBuilder simulationProgramBuilder = new SimulationProgramBuilder(program);
final ProgramBuilder lustreProgramBuilder = new ProgramBuilder(lustreProgram);
lustreProgramBuilder.clearNodes();
final Node node = lustreProgram.getMainNode();
final NodeBuilder nodeBuilder = new NodeBuilder(node);
nodeBuilder.clearProperties();
// Add the new node to the new lustre program
lustreProgramBuilder.addNode(nodeBuilder.build());
simulationProgramBuilder.setLustreProgram(lustreProgramBuilder.build());
return simulationProgramBuilder.build();
}
use of jkind.lustre.Program in project AGREE by loonwerks.
the class ReplaceFollowedByOperator method transform.
public static SimulationProgram transform(final SimulationProgram program) {
final Program lustreProgram = program.getLustreProgram();
if (lustreProgram.nodes.size() != 1) {
throw new IllegalArgumentException("Only lustre programs with exactly one node are supported");
}
final ReplaceFollowedByOperator visitor = new ReplaceFollowedByOperator();
final NodeBuilder nodeBuilder = new NodeBuilder(visitor.visit(lustreProgram.getMainNode()));
// Create variable for the step number
nodeBuilder.addInput(new VarDecl(stepVariableId, NamedType.INT));
// Add an output for the next step number
nodeBuilder.addOutput(new VarDecl(nextStepVariableId, NamedType.INT));
nodeBuilder.addEquation(new Equation(new IdExpr(nextStepVariableId), new BinaryExpr(new IdExpr(stepVariableId), BinaryOp.PLUS, new IntExpr(1))));
// Create the new lustre program using the new node
final ProgramBuilder lustreProgramBuilder = new ProgramBuilder(lustreProgram);
lustreProgramBuilder.clearNodes();
lustreProgramBuilder.addNode(nodeBuilder.build());
// Create the simulation program
final SimulationProgramBuilder simulationProgramBuilder = new SimulationProgramBuilder(program);
final Expr stepVariableExpr = new IdExpr(stepVariableId);
// Ensure that the initial step is greater than the first step when simulating inductive counterexamples
final int initialStepValue = program.getType().isInductive() ? firstStepValue + 1 : firstStepValue;
simulationProgramBuilder.addInitialConstraint(new BinaryExpr(stepVariableExpr, BinaryOp.EQUAL, new IntExpr(initialStepValue)));
simulationProgramBuilder.addCarryVariable(new CarryVariable(stepVariableExpr, new IdExpr(nextStepVariableId)));
simulationProgramBuilder.setLustreProgram(lustreProgramBuilder.build());
return simulationProgramBuilder.build();
}
use of jkind.lustre.Program in project AGREE by loonwerks.
the class ReplacePreOperator method transform.
public static SimulationProgram transform(final SimulationProgram program) {
final Program lustreProgram = program.getLustreProgram();
if (lustreProgram.nodes.size() != 1) {
throw new IllegalArgumentException("Only lustre programs with exactly one node are supported");
}
final SimulationProgramBuilder simulationProgramBuilder = new SimulationProgramBuilder(program);
final ProgramBuilder lustreProgramBuilder = new ProgramBuilder(lustreProgram);
lustreProgramBuilder.clearNodes();
final ReplacePreOperator visitor = new ReplacePreOperator();
final NodeBuilder nodeBuilder = new NodeBuilder(visitor.visit(lustreProgram).getMainNode());
// Add additional inputs, returns, expressions, etc
nodeBuilder.addInputs(visitor.newInputs);
nodeBuilder.addOutputs(visitor.newOutputs);
nodeBuilder.addEquations(visitor.newEquations);
lustreProgramBuilder.addNode(nodeBuilder.build());
simulationProgramBuilder.setLustreProgram(lustreProgramBuilder.build());
simulationProgramBuilder.addCarryVariables(visitor.newCarryVariables);
return simulationProgramBuilder.build();
}
use of jkind.lustre.Program in project AGREE by loonwerks.
the class AgreeProgramToSimulationProgram method transform.
public static SimulationProgram transform(final AgreeProgram agreeProgram, final SimulationProgramType type) {
Objects.requireNonNull(agreeProgram, "agreeProgram must not be null");
// Build a Component Instance to AgreeNode map
final Program lustreProgram = LustreAstBuilder.getAssumeGuaranteeLustreProgram(agreeProgram);
final AgreeRenaming agreeRenaming = new AgreeRenaming();
final AgreeLayout layout = new AgreeLayout();
RenamingVisitor.addRenamings(lustreProgram, agreeRenaming, agreeProgram.topNode.compInst, layout);
SimulationProgram program;
try {
final SimulationProgramBuilder builder = new SimulationProgramBuilder(type, agreeProgram.topNode.compInst, lustreProgram, agreeRenaming);
populateMetadata(builder, agreeProgram, lustreProgram, agreeRenaming, agreeRenaming.getRefMap());
program = builder.build();
} catch (final Exception ex) {
throw new AGREESimulatorException(lustreProgram, ex);
}
try {
program = CreateLocalVariablesForPropertyExpressions.transform(program);
program = RemovePropertySatisficationRequirements.transform(program);
program = RemoveCondacts.transform(program);
program = InlineNodeCalls.transform(program);
program = ReplaceFollowedByOperator.transform(program);
program = ReplacePreOperator.transform(program);
program = CreateSimulationProperties.transform(program);
program = RemoveProperties.transform(program);
program = CreateSimulationGuarantee.transform(program);
} catch (final Exception ex) {
throw new AGREESimulatorException(program.getLustreProgram(), ex);
}
return program;
}
Aggregations