use of jkind.lustre.Node in project AGREE by loonwerks.
the class AgreeASTBuilder method caseCallExpr.
/*
* CallExpr could be a node call, a regular function call, or an uninterpreted function call.
* The former two cases will return a NodeCallExpr, the third case will return a FunctionCallExpr.
*/
@Override
public Expr caseCallExpr(CallExpr expr) {
NamedElement namedEl = expr.getRef().getElm();
String fnName = AgreeUtils.getNodeName(namedEl);
boolean found = false;
for (Node node : globalNodes) {
if (node.id.equals(fnName)) {
found = true;
break;
}
}
if (!found) {
for (Function function : uninterpretedFunc) {
if (function.id.equals(fnName)) {
found = true;
break;
}
}
}
if (!found) {
DoubleDotRef fn = expr.getRef();
doSwitch(fn.getElm());
// for dReal integration
if (fnName.substring(0, 7).equalsIgnoreCase("dreal__")) {
fnName = namedEl.getName();
}
}
List<Expr> argResults = new ArrayList<>();
for (com.rockwellcollins.atc.agree.agree.Expr argExpr : expr.getArgs()) {
argResults.add(doSwitch(argExpr));
}
if (functionNameExists(fnName)) {
FunctionCallExpr functionCall = new FunctionCallExpr(fnName.replace("::", "__"), argResults);
return functionCall;
}
NodeCallExpr nodeCall = new NodeCallExpr(fnName.replace("::", "__"), argResults);
return nodeCall;
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class AgreeASTBuilder method caseNodeDef.
@Override
public Expr caseNodeDef(NodeDef expr) {
String nodeName = AgreeUtils.getNodeName(expr);
for (Node node : globalNodes) {
if (node.id.equals(nodeName)) {
return null;
}
}
List<VarDecl> inputs = agreeVarsFromArgs(expr.getArgs(), null);
List<VarDecl> outputs = agreeVarsFromArgs(expr.getRets(), null);
NodeBodyExpr body = expr.getNodeBody();
List<VarDecl> internals = agreeVarsFromArgs(body.getLocs(), null);
List<Equation> eqs = new ArrayList<>();
List<String> props = new ArrayList<>();
// TODO are node lemmas deprecated?
String lemmaName = "__nodeLemma";
int lemmaIndex = 0;
for (NodeStmt stmt : body.getStmts()) {
if (stmt instanceof NodeLemma) {
NodeLemma nodeLemma = (NodeLemma) stmt;
String propName = lemmaName + lemmaIndex++;
IdExpr eqId = new IdExpr(propName);
internals.add(new VarDecl(eqId.id, NamedType.BOOL));
Expr eqExpr = doSwitch(nodeLemma.getExpr());
Equation eq = new Equation(eqId, eqExpr);
eqs.add(eq);
props.add(eqId.id);
} else if (stmt instanceof NodeEq) {
eqs.add(nodeEqToEq((NodeEq) stmt));
}
}
NodeBuilder builder = new NodeBuilder(nodeName);
builder.addInputs(inputs);
builder.addOutputs(outputs);
builder.addLocals(internals);
builder.addEquations(eqs);
builder.addProperties(props);
Node n = builder.build();
addToNodeList(n);
return null;
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class VerifyHandler method createVerification.
private AnalysisResult createVerification(String resultName, ComponentInstance compInst, Program lustreProgram, AgreeProgram agreeProgram, AnalysisType analysisType) {
// ///////
// Logger logger = Logger.getLogger("MyLog");
// FileHandler fh;
// try {
// This block configure the logger with handler and formatter
// fh = new FileHandler("/home/thomas/zzz.log");
// logger.addHandler(fh);
// SimpleFormatter formatter = new SimpleFormatter();
// fh.setFormatter(formatter);
// logger.info("Agree Program:");
// AgreeASTPrettyprinter pp = new AgreeASTPrettyprinter();
// pp.visit(agreeProgram);
// logger.info(pp.toString());
// } catch (SecurityException ex) {
// ex.printStackTrace();
// }
// catch (IOException ex) {
// ex.printStackTrace();
// }
// //////////////
AgreeAutomaterRegistry aAReg = (AgreeAutomaterRegistry) ExtensionRegistry.getRegistry(ExtensionRegistry.AGREE_AUTOMATER_EXT_ID);
List<AgreeAutomater> automaters = aAReg.getAgreeAutomaters();
AgreeRenaming renaming = new AgreeRenaming();
AgreeLayout layout = new AgreeLayout();
Node mainNode = null;
for (Node node : lustreProgram.nodes) {
if (node.id.equals(lustreProgram.main)) {
mainNode = node;
break;
}
}
if (mainNode == null) {
throw new AgreeException("Could not find main lustre node after translation");
}
List<String> properties = new ArrayList<>();
RenamingVisitor.addRenamings(lustreProgram, renaming, compInst, layout);
addProperties(renaming, properties, mainNode, agreeProgram);
for (AgreeAutomater aa : automaters) {
renaming = aa.rename(renaming);
layout = aa.transformLayout(layout);
}
JKindResult result;
switch(analysisType) {
case Consistency:
result = new ConsistencyResult(resultName, mainNode.properties, Collections.singletonList(true), renaming);
break;
case Realizability:
result = new JRealizabilityResult(resultName, renaming);
break;
case AssumeGuarantee:
final Set<String> invertedProperties = renaming.getInvertedProperties();
List<Boolean> invertedPropertyMask = mainNode.properties.stream().map(p -> invertedProperties.contains(p)).collect(Collectors.toList());
result = new JKindResult(resultName, properties, invertedPropertyMask, renaming);
break;
default:
throw new AgreeException("Unhandled Analysis Type");
}
queue.add(result);
ComponentImplementation compImpl = AgreeUtils.getInstanceImplementation(compInst);
linker.setProgram(result, lustreProgram);
linker.setComponent(result, compImpl);
linker.setContract(result, getContract(compImpl));
linker.setLayout(result, layout);
linker.setReferenceMap(result, renaming.getRefMap());
linker.setLog(result, AgreeLogger.getLog());
linker.setRenaming(result, renaming);
// System.out.println(program);
return result;
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class AgreePatternTranslator method translate.
public static AgreeProgram translate(AgreeProgram program) {
List<Node> patternLustreNodes = new ArrayList<>();
// reset the static variable before refreshing its values in translateNode call
containsRealTimePatterns = false;
AgreeNode topNode = new AgreePatternTranslator().translateNode(program.topNode, true);
List<AgreeNode> agreeNodes = gatherNodes(topNode);
patternLustreNodes.addAll(program.globalLustreNodes);
return new AgreeProgram(agreeNodes, patternLustreNodes, program.uninterpretedFunctions, program.globalTypes, topNode, containsRealTimePatterns);
}
use of jkind.lustre.Node in project AGREE by loonwerks.
the class AgreeMakeClockedLustreNodes method visit.
@Override
public Expr visit(NodeCallExpr e) {
// check to see if we have already made a clocked version of this node
Node clockedNode = getClockedNode(e.node);
List<Expr> argList = new ArrayList<>();
argList.add(new IdExpr(clockVarName));
argList.add(new IdExpr(initVarName));
argList.addAll(e.args);
return new NodeCallExpr(clockedNode.id, acceptList(argList));
}
Aggregations