use of jkind.lustre.UnaryExpr in project AGREE by loonwerks.
the class AgreePatternTranslator method translatePatternConstraint.
private Expr translatePatternConstraint(AgreeSporadicPattern pattern, AgreeNodeBuilder builder, EObject varReference) {
AgreeVar jitterVar = new AgreeVar(JITTER_PREFIX + patternIndex, NamedType.REAL, varReference);
AgreeVar periodVar = new AgreeVar(PERIOD_PREFIX + patternIndex, NamedType.REAL, varReference);
AgreeVar timeoutVar = new AgreeVar(TIMEOUT_PREFIX + patternIndex, NamedType.REAL, varReference);
builder.addOutput(jitterVar);
builder.addOutput(periodVar);
builder.addOutput(timeoutVar);
IdExpr jitterId = new IdExpr(jitterVar.id);
IdExpr periodId = new IdExpr(periodVar.id);
IdExpr timeoutId = new IdExpr(timeoutVar.id);
builder.addEventTime(timeoutVar);
// -j <= jitter <= j
Expr jitterLow = new BinaryExpr(new UnaryExpr(UnaryOp.NEGATIVE, pattern.jitter), BinaryOp.LESSEQUAL, jitterId);
Expr jitterHigh = new BinaryExpr(jitterId, BinaryOp.LESSEQUAL, pattern.jitter);
builder.addAssertion(new AgreeStatement(null, new BinaryExpr(jitterLow, BinaryOp.AND, jitterHigh), pattern.reference));
// pnext >= 0 -> if pre ((pnext + jitter) = t) then pnext >= p +
// pre(pnext) else pre(pnext)
Expr prePNext = new UnaryExpr(UnaryOp.PRE, periodId);
Expr pNextInit = new BinaryExpr(periodId, BinaryOp.GREATEREQUAL, new RealExpr(BigDecimal.ZERO));
Expr pNextCond = new BinaryExpr(periodId, BinaryOp.PLUS, jitterId);
pNextCond = new BinaryExpr(pNextCond, BinaryOp.EQUAL, timeExpr);
pNextCond = new UnaryExpr(UnaryOp.PRE, pNextCond);
Expr pNextThen = new BinaryExpr(pattern.period, BinaryOp.PLUS, prePNext);
pNextThen = new BinaryExpr(periodId, BinaryOp.GREATEREQUAL, pNextThen);
Expr pNextHold = new BinaryExpr(periodId, BinaryOp.EQUAL, prePNext);
Expr pNextIf = new IfThenElseExpr(pNextCond, pNextThen, pNextHold);
Expr pNext = new BinaryExpr(pNextInit, BinaryOp.ARROW, pNextIf);
builder.addAssertion(new AgreeStatement(null, pNext, pattern.reference));
// timeout = pnext + jitter
Expr timeoutExpr = new BinaryExpr(periodId, BinaryOp.PLUS, jitterId);
timeoutExpr = new BinaryExpr(timeoutId, BinaryOp.EQUAL, timeoutExpr);
builder.addAssertion(new AgreeStatement(null, timeoutExpr, pattern.reference));
// event = (t = timeout)
Expr eventExpr = new BinaryExpr(timeExpr, BinaryOp.EQUAL, timeoutId);
eventExpr = new BinaryExpr(pattern.event, BinaryOp.EQUAL, eventExpr);
return eventExpr;
}
use of jkind.lustre.UnaryExpr in project AGREE by loonwerks.
the class AgreeRealtimeCalendarBuilder method getTimeConstraint.
public static Expr getTimeConstraint(Set<AgreeVar> events) {
IdExpr timeId = AgreePatternTranslator.timeExpr;
Expr preTime = new UnaryExpr(UnaryOp.PRE, timeId);
Expr nodeCall = new BinaryExpr(timeId, BinaryOp.MINUS, preTime);
for (AgreeVar eventVar : events) {
Expr event = new IdExpr(eventVar.id);
BinaryExpr timeChange = new BinaryExpr(event, BinaryOp.MINUS, timeId);
Expr preTimeChange = new UnaryExpr(UnaryOp.PRE, timeChange);
nodeCall = new NodeCallExpr(MIN_POS_NODE_NAME, preTimeChange, nodeCall);
}
nodeCall = new BinaryExpr(preTime, BinaryOp.PLUS, nodeCall);
Expr timeExpr = new BinaryExpr(timeId, BinaryOp.EQUAL, nodeCall);
timeExpr = new BinaryExpr(new BoolExpr(true), BinaryOp.ARROW, timeExpr);
Expr timeGrtPreTime = new BinaryExpr(timeId, BinaryOp.GREATER, preTime);
Expr timeInitZero = new BinaryExpr(timeId, BinaryOp.EQUAL, new RealExpr(BigDecimal.ZERO));
timeInitZero = new BinaryExpr(timeInitZero, BinaryOp.ARROW, timeGrtPreTime);
return new BinaryExpr(timeInitZero, BinaryOp.AND, timeExpr);
}
use of jkind.lustre.UnaryExpr in project AGREE by loonwerks.
the class AgreeRealtimeCalendarBuilder method getFallNode.
private static Node getFallNode() {
NodeBuilder builder = new NodeBuilder(FALL_NODE_NAME);
builder.addInput(new VarDecl("input", NamedType.BOOL));
builder.addOutput(new VarDecl("output", NamedType.BOOL));
IdExpr inputId = new IdExpr("input");
IdExpr outputId = new IdExpr("output");
Expr outputExpr = new UnaryExpr(UnaryOp.PRE, inputId);
Expr notInput = new UnaryExpr(UnaryOp.NOT, inputId);
outputExpr = new BinaryExpr(outputExpr, BinaryOp.AND, notInput);
outputExpr = new BinaryExpr(notInput, BinaryOp.ARROW, outputExpr);
builder.addEquation(new Equation(outputId, outputExpr));
return builder.build();
}
use of jkind.lustre.UnaryExpr in project AGREE by loonwerks.
the class GenerateUfcObligationsVisitor method constructNewNode.
/**
* Method for constructing new programs using the UFC obligations.
*/
private Node constructNewNode(Node existing, ObligationSet obs) {
List<VarDecl> locals = new ArrayList<>(existing.locals);
List<Equation> equations = new ArrayList<>(existing.equations);
// List<String> properties = new ArrayList<>(existing.properties);
// Change: MWW 5/6: Don't really want existing properties here.
List<String> properties = new ArrayList<>();
/* writing the TCG obligations back as trap properties by negating them... */
for (int i = 0; i < obs.positivePolarity.size(); i++) {
String varName = TRAP_PROP_PREFIX + i;
Obligation ob = obs.positivePolarity.get(i);
locals.add(new VarDecl(varName, NamedType.BOOL));
equations.add(new Equation(new IdExpr(varName), new UnaryExpr(UnaryOp.NOT, ob.getObligationExpr())));
properties.add(varName);
// renaming information
if (renaming != null) {
renaming.addRenaming(varName, ob.getEqAssignId(), ob.getTestedCondition().toString(), new HashSet<Obligation>(Arrays.asList(ob)));
}
System.out.println("Renaming: mapping " + varName + " --> " + ob.getEqAssignId());
}
Node newNode = new Node(existing.id, existing.inputs, existing.outputs, locals, equations, properties, existing.assertions, null, null, new ArrayList<String>());
return newNode;
}
use of jkind.lustre.UnaryExpr in project AMASE by loonwerks.
the class AddFaultDriverGuardAssertionVisitor method visit.
@Override
public Node visit(Node node) {
if (nodeId.equals(node.id)) {
List<Expr> assertions = Lists.newArrayList(node.assertions);
Expr expr = new IdExpr(faultDriverIds.get(0));
for (int i = 1; i < faultDriverIds.size(); ++i) {
expr = new BinaryExpr(expr, BinaryOp.AND, new IdExpr(faultDriverIds.get(i)));
}
assertions.add(new UnaryExpr(UnaryOp.NOT, expr));
return new Node(node.location, node.id, node.inputs, node.outputs, node.locals, node.equations, node.properties, assertions, node.realizabilityInputs, node.contract, node.ivc);
}
return node;
}
Aggregations