use of jkind.lustre.Type in project AGREE by loonwerks.
the class AgreeUtils method getInitValueFromType.
public static Expr getInitValueFromType(Type type) {
if (type instanceof NamedType) {
return getInitValueFromType((NamedType) type);
}
if (type instanceof RecordType) {
RecordType recordType = (RecordType) type;
Map<String, Expr> fieldMap = new HashMap<>();
for (Entry<String, Type> entry : recordType.fields.entrySet()) {
Expr subExpr = getInitValueFromType(entry.getValue());
fieldMap.put(entry.getKey(), subExpr);
}
return new RecordExpr(recordType.id, fieldMap);
}
throw new AgreeException("AGREE cannot figure out an initial type for Lustre type: " + type.getClass());
}
use of jkind.lustre.Type 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);
}
use of jkind.lustre.Type in project AGREE by loonwerks.
the class AgreeNodeToLustreContract method translate.
public static Node translate(AgreeNode agreeNode, AgreeProgram agreeProgram) {
List<Node> nodes = new ArrayList<>();
nodes.addAll(agreeProgram.globalLustreNodes);
// this node needs to be the last in the list
// so that it is set as the main node in the program
nodes.add(translateNode(agreeNode));
List<TypeDef> types = new ArrayList<>();
for (Type type : agreeProgram.globalTypes) {
RecordType recType = (RecordType) type;
types.add(new TypeDef(recType.id, type));
}
Program program = new ProgramBuilder().addTypes(types).addNodes(nodes).build();
program = InlineNodeCalls.program(program);
program = FlattenPres.program(program);
Node main = DistributePres.node(program.getMainNode());
main = OrderEquations.node(main);
return main;
}
use of jkind.lustre.Type in project AGREE by loonwerks.
the class PrettyPrintVisitor method writeType.
private void writeType(Type type) {
if (type instanceof RecordType) {
RecordType recordType = (RecordType) type;
write("struct {");
Iterator<Entry<String, Type>> iterator = recordType.fields.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, Type> entry = iterator.next();
write(entry.getKey());
write(" : ");
write(entry.getValue());
if (iterator.hasNext()) {
write("; ");
}
}
write("}");
} else if (type instanceof EnumType) {
EnumType enumType = (EnumType) type;
write("enum {");
Iterator<String> iterator = enumType.values.iterator();
while (iterator.hasNext()) {
write(iterator.next());
if (iterator.hasNext()) {
write(", ");
}
}
write("}");
} else {
write(type);
}
}
use of jkind.lustre.Type in project AMASE by loonwerks.
the class FaultASTBuilder method addSafetyEqInterval.
/**
* Add saftey eq intervals to the safetyEqAsserts and safetyEqVars lists.
*
* @param fault The fault with these interval eq stmts.
* @param stmt The IntervalEq statement
*/
private void addSafetyEqInterval(Fault fault, IntervalEq stmt) {
Expr lhsIdExpr = new IdExpr(stmt.getLhs_int().getName());
SafetyInterval iv = stmt.getInterv();
BinaryOp leftOp = ((iv instanceof ClosedSafetyInterval) || (iv instanceof OpenLeftSafetyInterval)) ? BinaryOp.GREATEREQUAL : BinaryOp.GREATER;
BinaryOp rightOp = ((iv instanceof ClosedSafetyInterval) || (iv instanceof OpenLeftSafetyInterval)) ? BinaryOp.LESSEQUAL : BinaryOp.LESS;
Expr leftSideExpr = new BinaryExpr(lhsIdExpr, leftOp, builder.doSwitch(iv.getLow()));
Expr rightSideExpr = new BinaryExpr(lhsIdExpr, rightOp, builder.doSwitch(iv.getHigh()));
Expr expr = new BinaryExpr(leftSideExpr, BinaryOp.AND, rightSideExpr);
fault.safetyEqAsserts.add(new AgreeStatement("", expr, stmt));
// Get type in Lustre/JKind format
com.rockwellcollins.atc.agree.AgreeTypeSystem.TypeDef typeDef = AgreeTypeSystem.typeDefFromType(stmt.getLhs_int().getType());
Type type = SafetyUtil.getLustreType(typeDef);
// Throw exception if type is neither real nor int
if ((type == null) || (type.toString().equals("bool"))) {
new SafetyException("Interval statement types can only be real or int. The problem interval is called: " + stmt.getLhs_int().getName() + ".");
}
// Add to safetyEqVars list
fault.safetyEqVars.add(new AgreeVar(stmt.getLhs_int().getName(), type, this.agreeNode.reference, this.agreeNode.compInst));
}
Aggregations