use of jkind.lustre.Type in project AGREE by loonwerks.
the class AgreeASTBuilder method portToAgreeVar.
private void portToAgreeVar(List<AgreeVar> outputs, List<AgreeVar> inputs, FeatureInstance feature, List<AgreeStatement> assumptions, List<AgreeStatement> guarantees) {
Feature dataFeature = feature.getFeature();
NamedElement dataClass;
if (dataFeature instanceof DataPort) {
DataPort dataPort = (DataPort) dataFeature;
dataClass = dataPort.getDataFeatureClassifier();
} else if (dataFeature instanceof EventDataPort) {
EventDataPort eventDataPort = (EventDataPort) dataFeature;
dataClass = eventDataPort.getDataFeatureClassifier();
} else {
dataClass = null;
}
String name = feature.getName();
boolean isEvent = feature.getCategory() == FeatureCategory.EVENT_DATA_PORT || feature.getCategory() == FeatureCategory.EVENT_PORT;
if (isEvent) {
AgreeVar var = new AgreeVar(name + eventSuffix, NamedType.BOOL, feature.getFeature(), feature.getComponentInstance(), feature);
switch(feature.getDirection()) {
case IN:
inputs.add(var);
break;
case OUT:
outputs.add(var);
break;
default:
throw new AgreeException("Unable to reason about bi-directional event port: " + dataFeature.getQualifiedName());
}
}
if (dataClass == null) {
// we do not reason about this type
return;
}
AgreeTypeSystem.TypeDef td = AgreeTypeSystem.inferFromNamedElement(dataFeature);
Type type = symbolTable.updateLustreTypeMap(td);
if (type == null) {
// we do not reason about this type
return;
}
AgreeVar agreeVar = new AgreeVar(name, type, feature.getFeature(), feature.getComponentInstance(), feature);
switch(feature.getDirection()) {
case IN:
inputs.add(agreeVar);
if (dataClass instanceof DataClassifier) {
List<Expr> constraints = getConstraintsFromTypeDef(name, td);
if (!constraints.isEmpty()) {
assumptions.add(getDataClassifierTypePredicate(feature.getName(), constraints, dataFeature));
}
}
break;
case OUT:
outputs.add(agreeVar);
if (dataClass instanceof DataClassifier) {
List<Expr> constraints = getConstraintsFromTypeDef(name, td);
if (!constraints.isEmpty()) {
guarantees.add(getDataClassifierTypePredicate(feature.getName(), constraints, dataFeature));
}
}
break;
default:
throw new AgreeException("Unable to reason about bi-directional event port: " + dataFeature.getQualifiedName());
}
}
use of jkind.lustre.Type in project AGREE by loonwerks.
the class AgreeASTBuilder method getAgreeProgram.
public AgreeProgram getAgreeProgram(ComponentInstance compInst, boolean isMonolithic) {
boolean containsRTPatterns = false;
this.isMonolithic = isMonolithic;
globalNodes = new ArrayList<>();
uninterpretedFunc = new ArrayList<>();
renamings = new HashMap<>();
refMap = new HashMap<>();
// EGM: array-backend
symbolTable = new TypeTable();
AgreeNode topNode = getAgreeNode(compInst, true);
List<AgreeNode> agreeNodes = gatherNodes(topNode);
// EGM: array-backend
List<Type> lustreTypes = symbolTable.getLustreTypes();
// have to convert the types. The reason we use Record types in the
// first place rather than the more general types is so we can check set
// containment easily
AgreeProgram program = new AgreeProgram(agreeNodes, new ArrayList<>(globalNodes), new ArrayList<>(uninterpretedFunc), lustreTypes, topNode);
// if there are any patterns in the AgreeProgram we need to inline them
program = AgreePatternTranslator.translate(program);
containsRTPatterns = program.containsRealTimePatterns;
program = AgreeInlineLatchedConnections.translate(program);
program = AgreeMakeClockedLustreNodes.translate(program);
// go through the extension registries and transform the program
AgreeAutomaterRegistry aAReg = (AgreeAutomaterRegistry) ExtensionRegistry.getRegistry(ExtensionRegistry.AGREE_AUTOMATER_EXT_ID);
List<AgreeAutomater> automaters = aAReg.getAgreeAutomaters();
for (AgreeAutomater aa : automaters) {
program = aa.transform(program);
}
program.containsRealTimePatterns(containsRTPatterns);
// EGM: DEBUG
System.out.println("getAgreeProgram");
com.rockwellcollins.atc.agree.analysis.ast.visitors.AgreeASTPrettyprinter pp = new com.rockwellcollins.atc.agree.analysis.ast.visitors.AgreeASTPrettyprinter();
program.accept(pp);
System.out.println(pp.toString());
System.out.println(AgreeLogger.getLog());
return program;
}
use of jkind.lustre.Type in project AGREE by loonwerks.
the class AgreeASTBuilder method getAgreePortNames.
private List<AgreeVar> getAgreePortNames(ConnectionEnd port, String prefix, ComponentInstance compInst) {
String portName = port.getName();
List<AgreeVar> subVars = new ArrayList<>();
// of a record type. Otherwise it is the first member of a feature group
if (prefix == null) {
prefix = "";
} else if (port instanceof DataSubcomponent) {
prefix = prefix + ".";
} else {
prefix = prefix + dotChar;
}
if (port instanceof FeatureGroup) {
FeatureGroup featGroup = (FeatureGroup) port;
FeatureGroupType featType = featGroup.getFeatureGroupType();
for (FeatureGroup subFeatGroup : featType.getOwnedFeatureGroups()) {
subVars.addAll(getAgreePortNames(subFeatGroup, null, compInst));
}
for (DataPort subPort : featType.getOwnedDataPorts()) {
subVars.addAll(getAgreePortNames(subPort, null, compInst));
}
for (EventDataPort subPort : featType.getOwnedEventDataPorts()) {
subVars.addAll(getAgreePortNames(subPort, null, compInst));
}
for (EventPort subPort : featType.getOwnedEventPorts()) {
subVars.addAll(getAgreePortNames(subPort, null, compInst));
}
List<AgreeVar> prefixedStrs = new ArrayList<>();
for (AgreeVar subVar : subVars) {
prefixedStrs.add(new AgreeVar(prefix + portName + dotChar + subVar.id, subVar.type, subVar.reference, compInst));
}
subVars = prefixedStrs;
}
if (port instanceof DataPort || port instanceof EventDataPort || port instanceof DataSubcomponent) {
Type type = getConnectionEndType(port);
if (type != null) {
subVars.add(new AgreeVar(prefix + portName, type, port, compInst));
}
}
if (port instanceof EventDataPort || port instanceof EventPort) {
subVars.add(new AgreeVar(prefix + portName + eventSuffix, NamedType.BOOL, port, compInst));
}
return subVars;
}
use of jkind.lustre.Type 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.Type 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;
}
Aggregations