use of jkind.lustre.Node in project AGREE by loonwerks.
the class AgreeASTBuilder method getSynchConstraint.
private Expr getSynchConstraint(SynchStatement spec, List<AgreeNode> subNodes) {
int val1 = Integer.decode(spec.getVal());
if (val1 == 0) {
return new BoolExpr(true);
}
List<Expr> clockIds = new ArrayList<>();
Expr clockAssertion;
for (AgreeNode subNode : subNodes) {
clockIds.add(new IdExpr(subNode.clockVar.id));
}
String dfaPrefix = getObjectLocationPrefix(spec);
if (spec.getVal2() == null) {
Node dfaNode = AgreeCalendarUtils.getDFANode(dfaPrefix + "__DFA_NODE", val1);
Node calNode = AgreeCalendarUtils.getCalendarNode(dfaPrefix + "__CALENDAR_NODE", dfaNode.id, clockIds.size());
// we do not need to make copies of the nodes if they exist
if (!nodeNameExists(dfaNode.id)) {
if (nodeNameExists(calNode.id)) {
throw new AgreeException("The calander node should not exist if the dfa node does not exist");
}
addToNodeList(dfaNode);
addToNodeList(calNode);
}
clockAssertion = new NodeCallExpr(calNode.id, clockIds);
} else {
int val2 = Integer.decode(spec.getVal2());
String nodeName = "__calendar_node_" + val1 + "_" + val2;
nodeName = dfaPrefix + nodeName;
Node calNode = AgreeCalendarUtils.getMNCalendar(nodeName, val1, val2);
if (!nodeNameExists(calNode.id)) {
addToNodeList(calNode);
}
clockAssertion = new BoolExpr(true);
int i, j;
for (i = 0; i < clockIds.size(); i++) {
Expr clock1 = clockIds.get(i);
for (j = i + 1; j < clockIds.size(); j++) {
Expr clock2 = clockIds.get(j);
NodeCallExpr nodeCall = new NodeCallExpr(nodeName, clock1, clock2);
clockAssertion = LustreExprFactory.makeANDExpr(clockAssertion, nodeCall);
nodeCall = new NodeCallExpr(nodeName, clock2, clock1);
clockAssertion = LustreExprFactory.makeANDExpr(clockAssertion, nodeCall);
}
}
}
return clockAssertion;
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class AgreeASTBuilder method caseFnDef.
@Override
public Expr caseFnDef(FnDef fnDef) {
String nodeName = AgreeUtils.getNodeName(fnDef).replace("::", "__");
for (Node node : globalNodes) {
if (node.id.equals(nodeName)) {
return null;
}
}
List<VarDecl> inputs = agreeVarsFromArgs(fnDef.getArgs(), null);
Expr bodyExpr = doSwitch(fnDef.getExpr());
// EGM: array-backend
// Type outType = getNamedType(AgreeTypeUtils.getTypeName(fnDef.getType(), typeMap, globalTypes));
Type outType = symbolTable.updateLustreTypeMap(AgreeTypeSystem.typeDefFromType(fnDef.getType()));
if (outType != null) {
VarDecl outVar = new VarDecl("_outvar", outType);
List<VarDecl> outputs = Collections.singletonList(outVar);
Equation eq = new Equation(new IdExpr("_outvar"), bodyExpr);
List<Equation> eqs = Collections.singletonList(eq);
NodeBuilder builder = new NodeBuilder(nodeName);
builder.addInputs(inputs);
builder.addOutputs(outputs);
builder.addEquations(eqs);
Node node = builder.build();
addToNodeList(node);
}
return null;
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class AgreeASTPrettyprinter method visit.
@Override
public Void visit(AgreeProgram program) {
if (program.containsRealTimePatterns) {
write("-- Program contains real-time patterns");
newline();
newline();
}
write("-- Program top-level node is: " + program.topNode.id);
newline();
newline();
if (!program.globalTypes.isEmpty()) {
for (Type type : program.globalTypes) {
String name = "dummy";
if (type instanceof RecordType) {
name = ((RecordType) type).id;
} else if (type instanceof EnumType) {
name = ((EnumType) type).id;
}
TypeDef typeDef = new TypeDef(Location.NULL, name, type);
typeDef.accept(this);
newline();
}
newline();
}
if (!program.globalLustreNodes.isEmpty()) {
Iterator<Node> iterator = program.globalLustreNodes.iterator();
while (iterator.hasNext()) {
iterator.next().accept(this);
newline();
if (iterator.hasNext()) {
newline();
}
}
newline();
}
if (!program.uninterpretedFunctions.isEmpty()) {
Iterator<Function> iterator = program.uninterpretedFunctions.iterator();
while (iterator.hasNext()) {
iterator.next().accept(this);
newline();
if (iterator.hasNext()) {
newline();
}
}
newline();
}
Iterator<AgreeNode> iterator = program.agreeNodes.iterator();
while (iterator.hasNext()) {
iterator.next().accept(this);
newline();
if (iterator.hasNext()) {
newline();
}
}
newline();
return null;
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class AgreeMakeClockedLustreNodes method getClockedNode.
private Node getClockedNode(String node) {
Node clockedNode = clockedNodeMap.get(node);
if (clockedNode == null) {
Node originalNode = null;
for (Node progNode : origProgram.globalLustreNodes) {
if (progNode.id == node) {
originalNode = progNode;
break;
}
}
NodeBuilder builder = new NodeBuilder(originalNode);
builder.setId(clockedNodePrefix + originalNode.id);
builder.clearEquations();
builder.clearInputs();
builder.addInput(new VarDecl(clockVarName, NamedType.BOOL));
builder.addInput(new VarDecl(initVarName, NamedType.BOOL));
builder.addInputs(originalNode.inputs);
AgreeMakeClockedLustreNodes visitor = new AgreeMakeClockedLustreNodes(this, originalNode);
for (Equation eq : originalNode.equations) {
Expr newExpr = eq.expr.accept(visitor);
// this will make an unguarded pre expression, but any non initialized
// outputs should be masked by the init expression in the calling agree node
newExpr = new IfThenElseExpr(new IdExpr(clockVarName), newExpr, new UnaryExpr(UnaryOp.PRE, eq.lhs.get(0)));
builder.addEquation(new Equation(eq.lhs, newExpr));
clockedNodeMap.putAll(visitor.clockedNodeMap);
}
builder.addLocals(visitor.stateVars);
builder.addEquations(visitor.stateVarEqs);
clockedNode = builder.build();
clockedNodeMap.put(node, clockedNode);
}
return clockedNode;
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class AgreeASTMapVisitor method visit.
@Override
public AgreeProgram visit(AgreeProgram e) {
List<AgreeNode> agreeNodes = new ArrayList<>();
for (AgreeNode node : e.agreeNodes) {
AgreeNode visitedNode = visitedNodes.get(node.compInst);
if (visitedNode == null) {
visitedNode = this.visit(node);
}
agreeNodes.add(visitedNode);
}
List<Node> globalLustreNodes = new ArrayList<>();
for (Node node : e.globalLustreNodes) {
globalLustreNodes.add(this.visit(node));
}
List<Function> uninterpretedFunctions = new ArrayList<>();
for (Function function : e.uninterpretedFunctions) {
uninterpretedFunctions.add(this.visit(function));
}
List<jkind.lustre.Type> globalTypes = new ArrayList<>();
for (Type ty : e.globalTypes) {
globalTypes.add(ty.accept(lustreTypeMapVisitor));
}
AgreeNode topNode = this.visit(e.topNode);
return new AgreeProgram(agreeNodes, globalLustreNodes, uninterpretedFunctions, globalTypes, topNode);
}
Aggregations