use of jkind.results.Signal in project AGREE by loonwerks.
the class TcgXmlReader method getSignal.
private Signal<Value> getSignal(Element signalElement) {
String name = signalElement.getAttribute("name");
String type = signalElement.getAttribute("type");
if (type.contains("subrange ")) {
type = "int";
}
Signal<Value> signal = new Signal<>(name);
for (Element valueElement : getElements(signalElement, "Value")) {
int time = Integer.parseInt(valueElement.getAttribute(getTimeAttribute()));
signal.putValue(time, getValue(valueElement, type));
}
return signal;
}
use of jkind.results.Signal in project AGREE by loonwerks.
the class AgreeCounterexampleContentProvider method getElements.
@Override
public Object[] getElements(Object inputElement) {
Counterexample cex = (Counterexample) inputElement;
List<Object> result = new ArrayList<>();
boolean first = true;
for (String category : layout.getCategories()) {
List<Signal<Value>> signals = cex.getCategorySignals(layout, category);
if (!signals.isEmpty()) {
if (first) {
first = false;
} else {
result.add(new Spacer());
}
result.add(new CategoryHeader(category));
List<Signal<Value>> inputSignals = signals.stream().filter(it -> {
EObject ref = refMap.get(it.getName());
return (ref instanceof org.osate.aadl2.Port) && ((org.osate.aadl2.Port) ref).isIn();
}).collect(Collectors.toList());
List<Signal<Value>> outputSignals = signals.stream().filter(it -> {
EObject ref = refMap.get(it.getName());
return (ref instanceof org.osate.aadl2.Port) && ((org.osate.aadl2.Port) ref).isOut();
}).collect(Collectors.toList());
List<Signal<Value>> otherSignals = signals.stream().filter(it -> !(inputSignals.contains(it) || outputSignals.contains(it))).collect(Collectors.toList());
result.addAll(SignalGrouper.group(null, Stream.of(inputSignals, otherSignals, outputSignals).flatMap(Collection::stream).collect(Collectors.toList())));
}
}
return result.toArray();
}
use of jkind.results.Signal in project AGREE by loonwerks.
the class AgreeMenuListener method viewCexConsole.
private void viewCexConsole(final Counterexample cex, final Layout layout, Map<String, EObject> refMap, final AgreeRenaming renaming) {
final MessageConsole console = findConsole("Counterexample");
showConsole(console);
console.clearConsole();
console.addPatternMatchListener(new AgreePatternListener(refMap));
/*
* From the Eclipse API: "Clients should avoid writing large amounts of
* output to this stream in the UI thread. The console needs to process
* the output in the UI thread and if the client hogs the UI thread
* writing output to the console, the console will not be able to
* process the output."
*/
new Thread(() -> {
try (MessageConsoleStream out = console.newMessageStream()) {
for (String category : layout.getCategories()) {
if (isEmpty(category, cex, layout)) {
continue;
}
printHLine(out, cex.getLength());
if (category == "") {
out.println("Variables for the selected component implementation");
} else {
out.println("Variables for " + category);
}
printHLine(out, cex.getLength());
out.print(String.format("%-60s", "Variable Name"));
for (int k1 = 0; k1 < cex.getLength(); k1++) {
out.print(String.format("%-15s", k1));
}
out.println();
printHLine(out, cex.getLength());
List<Signal<Value>> inputSignals = new ArrayList<>();
List<Signal<Value>> outputSignals = new ArrayList<>();
List<Signal<Value>> stateSignals = new ArrayList<>();
for (Signal<Value> signal : cex.getCategorySignals(layout, category)) {
// dont' print out values for properties
if (signal.getName().contains(":")) {
continue;
}
String signalName = signal.getName();
EObject ref = renaming.findBestReference(signalName);
boolean isInput = (ref instanceof org.osate.aadl2.Port) ? ((org.osate.aadl2.Port) ref).isIn() : false;
boolean isOutput = (ref instanceof org.osate.aadl2.Port) ? ((org.osate.aadl2.Port) ref).isOut() : false;
if (isInput) {
inputSignals.add(signal);
} else if (isOutput) {
outputSignals.add(signal);
} else {
stateSignals.add(signal);
}
}
out.println("Inputs:");
inputSignals.forEach(it -> printSignal(out, it, cex.getLength()));
out.println("State:");
stateSignals.forEach(it -> printSignal(out, it, cex.getLength()));
out.println("Outputs:");
outputSignals.forEach(it -> printSignal(out, it, cex.getLength()));
out.println();
}
printHLine(out, cex.getLength());
// print uninterpreted functions using Jkind CounterexampleFormatter
AgreeUninterpretedFunctionFormatter uFcnFormatter = new AgreeUninterpretedFunctionFormatter(cex);
out.println(uFcnFormatter.functions());
} catch (IOException e) {
e.printStackTrace();
}
}).start();
}
use of jkind.results.Signal in project AGREE by loonwerks.
the class Simulation method executeFrame.
private SimulationFrameResults executeFrame(final List<Expr> assertions, final Set<SimulationProperty> disabledProperties) throws InterruptedException {
assert assertions != null;
// Build the final constrained lustre specification for the frame.
final ProgramBuilder programBuilder = new ProgramBuilder(program.getLustreProgram());
programBuilder.clearNodes();
final NodeBuilder nodeBuilder = new NodeBuilder(program.getLustreProgram().getMainNode());
// Add assignments for the sim assertions signal
// Actual assertions are not used because they can result in an inconsistent Lustre program which will prevent
// the set of support from being generated when using yices.
Expr prevSimAssertionExpr = new BoolExpr(true);
for (int assertionIndex = 0; assertionIndex < assertions.size(); assertionIndex++) {
final String simAssertionSignalId = CreateSimulationGuarantee.SIMULATION_ASSERTIONS_ID + assertionIndex;
final IdExpr simAssertionExpr = new IdExpr(simAssertionSignalId);
nodeBuilder.addLocal(new VarDecl(simAssertionSignalId, NamedType.BOOL));
nodeBuilder.addEquation(new Equation(simAssertionExpr, new BinaryExpr(prevSimAssertionExpr, BinaryOp.AND, assertions.get(assertionIndex))));
prevSimAssertionExpr = simAssertionExpr;
}
nodeBuilder.addEquation(new Equation(new IdExpr(CreateSimulationGuarantee.SIMULATION_ASSERTIONS_ID), prevSimAssertionExpr));
// Add assignments for property enablement variables
for (final SimulationProperty simProp : program.getSimulationProperties()) {
if (simProp.getEnablementVariableId() != null) {
nodeBuilder.addEquation(new Equation(new IdExpr(simProp.getEnablementVariableId()), new BoolExpr(disabledProperties.contains(simProp) ? false : true)));
}
}
// Build the lustre program for the frame
programBuilder.addNode(nodeBuilder.build());
final Program constrainedLustreProgram = programBuilder.build();
// Prepare to execute JKind
final KindApi api = PreferencesUtil.getKindApi();
// Enable IVC Reduction capability if using JKind
if (api instanceof JKindApi) {
final JKindApi jkindApi = (JKindApi) api;
jkindApi.setIvcReduction();
}
// Execute JKind
final JKindResult result = new JKindResult("Simulation");
// Lucas: This seems to be needed. If we do not add properties to the result explicitly,
// it looks like the result will grab the main property name with the main node prepended.
// This is causing an error when retrieving the property result in the
// if/then/else block structure below.
constrainedLustreProgram.getMainNode().properties.forEach(p -> result.addProperty(p));
System.out.println(constrainedLustreProgram.toString());
try {
final IProgressMonitor currentMonitor = new NullProgressMonitor();
api.execute(constrainedLustreProgram, result, currentMonitor);
// Create a model state from the results.
String simulationGuaranteeId = CreateSimulationGuarantee.SIMULATION_GUARANTEE_ID;
final PropertyResult propertyResult = result.getPropertyResult(simulationGuaranteeId);
final Property property = propertyResult.getProperty();
if (property == null) {
throw new AGREESimulatorException("Unexpected case. Unable to read property results", constrainedLustreProgram);
} else if (property instanceof InvalidProperty) {
final InvalidProperty invalidProperty = (InvalidProperty) property;
final Counterexample counterexample = invalidProperty.getCounterexample();
if (counterexample.getLength() != 1) {
throw new AGREESimulatorException("Unexpected case. Counterexample has " + counterexample.getLength() + " steps", constrainedLustreProgram);
}
SimulationState newState = SimulationState.WAITING_FOR_COMMANDS;
// and a counterexample will not have been generated. This should only occur when a disabled property, lemma, top-level guarantee, or a non-top-level assumption is false.
for (final SimulationProperty simulationProp : program.getSimulationProperties()) {
if (!disabledProperties.contains(simulationProp)) {
for (final String propLustreId : simulationProp.getLustreIds()) {
final Signal<BooleanValue> signal = counterexample.getBooleanSignal(propLustreId);
if (signal == null) {
throw new AGREESimulatorException("Unable to get signal for guarantee property: " + propLustreId, constrainedLustreProgram);
} else {
if (!signal.getValue(0).value) {
newState = SimulationState.WARNING_PROPERTY_NOT_SATISFIED;
break;
}
}
}
}
}
return new SimulationFrameResults(constrainedLustreProgram, counterexample, disabledProperties, newState);
} else if (property instanceof UnknownProperty) {
return new SimulationFrameResults(constrainedLustreProgram, assertions, disabledProperties, SimulationState.HALTED_UNABLE_TO_SATISFY_CONSTRAINTS);
} else if (property instanceof ValidProperty) {
return new SimulationFrameResults(constrainedLustreProgram, assertions, disabledProperties, ((ValidProperty) property).getIvc(), SimulationState.HALTED_UNABLE_TO_SATISFY_CONSTRAINTS);
} else {
throw new AGREESimulatorException("Unhandled case. Property is of type: " + property.getClass(), constrainedLustreProgram);
}
} catch (JKindException ex) {
if (ex.getCause() instanceof InterruptedException) {
throw (InterruptedException) ex.getCause();
}
throw new AGREESimulatorException(constrainedLustreProgram, ex, result.getText());
}
}
use of jkind.results.Signal in project AGREE by loonwerks.
the class ExportAction method addElementToCounterexample.
private static void addElementToCounterexample(final Counterexample cex, final Object element, final AGREESimulationState engineState) {
assert engineState.getElementLustreId(element) != null;
// Create the signal
final Signal<Value> newSignal = new Signal<>(engineState.getElementLustreId(element));
// Populate the signal's values
final int numberOfFrames = engineState.getNumberOfFrames();
for (int frameIndex = 0; frameIndex < numberOfFrames; frameIndex++) {
final Value value = engineState.getElementLustreValue(frameIndex, element);
if (value != null) {
newSignal.putValue(frameIndex, value);
}
}
// Add signal to the counterexample
cex.addSignal(newSignal);
}
Aggregations