| /******************************************************************************* |
| * Copyright (c) 2016 CEA LIST. |
| * |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Created on: 20 mai 2010 |
| * |
| * Contributors: |
| * Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr |
| * - Initial API and implementation |
| ******************************************************************************/ |
| |
| #include "AvmGuardPrimitive.h" |
| |
| #include <computer/EvaluationEnvironment.h> |
| #include <computer/ExecutionEnvironment.h> |
| |
| #include <computer/PathConditionProcessor.h> |
| |
| #include <fml/expression/AvmCode.h> |
| |
| #include <fml/runtime/ExecutionData.h> |
| #include <fml/runtime/RuntimeID.h> |
| |
| #include <solver/api/SolverDef.h> |
| #include <solver/api/SolverFactory.h> |
| |
| |
| namespace sep |
| { |
| |
| |
| /** |
| *************************************************************************** |
| * execution of a GUARD program |
| *************************************************************************** |
| */ |
| bool AvmPrimitive_Guard::run(ExecutionEnvironment & ENV) |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT_TEST_DECISION ) |
| AVM_OS_TRACE << "guard :> " << ENV.mARG->at(0).str() << std::endl; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT_TEST_DECISION ) |
| |
| if( ENV.mARG->at(0).isEqualTrue() ) |
| { |
| //!! NO NEED PATH CONDITION UPDATE |
| ENV.appendOutput( ENV.mARG->outED ); |
| } |
| |
| else if( ENV.mARG->at(0).isEqualFalse() ) |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT) |
| AVM_OS_TRACE << "THROW UNSATISFIED << GUARD >> :> ctx: " |
| << ENV.mARG->outED->mRID.str() << EOL |
| << TAB << "condition: " << ENV.inCODE->str() |
| << " |=> " << ENV.mARG->at(0).str() << EOL_FLUSH; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT) |
| } |
| |
| else |
| { |
| if( not PathConditionProcessor::appendPathCondition( |
| ENV, ENV.mARG->outED, ENV.mARG->at(0)) ) |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT) |
| AVM_OS_TRACE << "THROW UNSATISFIED << GUARD >> :> ctx: " |
| << ENV.mARG->outED->mRID.str() << EOL |
| << TAB << " PC: " |
| << ENV.mARG->outED->getAllPathCondition().str() << EOL |
| << TAB << "condition: " << ENV.inCODE->str() << EOL |
| << TAB << " |=> " << ENV.mARG->at(0).str() |
| << EOL_FLUSH; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT) |
| } |
| } |
| |
| return( true ); |
| } |
| |
| |
| |
| /** |
| *************************************************************************** |
| * execution of a TIMED GUARD program |
| *************************************************************************** |
| */ |
| bool AvmPrimitive_TimedGuard::run(ExecutionEnvironment & ENV) |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT_TEST_DECISION ) |
| AVM_OS_TRACE << "tguard :> " << ENV.mARG->at(0).str() << std::endl; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT_TEST_DECISION ) |
| |
| if( ENV.mARG->at(0).isEqualTrue() ) |
| { |
| //!! NO NEED PATH CONDITION UPDATE |
| ENV.outEDS.append( ENV.mARG->outED ); |
| } |
| |
| else if( ENV.mARG->at(0).isEqualFalse() ) |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT) |
| AVM_OS_TRACE << "THROW UNSATISFIED << GUARD >> :> ctx: " |
| << ENV.mARG->outED->mRID.str() << EOL |
| << TAB << "condition: " << ENV.inCODE->str() |
| << " |=> " << ENV.mARG->at(0).str() << EOL_FLUSH; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT) |
| } |
| |
| else |
| { |
| if( not PathConditionProcessor::appendPathTimedCondition( |
| ENV, ENV.mARG->outED, ENV.mARG->at(0)) ) |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT) |
| AVM_OS_TRACE << "THROW UNSATISFIED << TGUARD >> :> ctx: " |
| << ENV.mARG->outED->mRID.str() << EOL |
| << TAB << " PC: " |
| << ENV.mARG->outED->getAllPathCondition().str() << EOL |
| << TAB << "condition: " << ENV.inCODE->str() << EOL |
| << TAB << " |=> " << ENV.mARG->at(0).str() |
| << EOL_FLUSH; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT) |
| } |
| } |
| |
| return( true ); |
| } |
| |
| |
| |
| /** |
| *************************************************************************** |
| * execution of a EVENT program |
| *************************************************************************** |
| */ |
| bool AvmPrimitive_Event::run(ExecutionEnvironment & ENV) |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT_TEST_DECISION ) |
| AVM_OS_TRACE << "event :> " << ENV.mARG->at(0).str() << std::endl; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT_TEST_DECISION ) |
| |
| if( ENV.mARG->at(0).isEqualTrue() ) |
| { |
| //!! NO NEED PATH CONDITION UPDATE |
| ENV.appendOutput( ENV.mARG->outED ); |
| } |
| else if( ENV.mARG->at(0).isEqualFalse() ) |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT) |
| AVM_OS_TRACE << "THROW UNSATISFIED << EVENT >> : " |
| << ENV.mARG->outED->mRID.strUniqId() << " , " |
| << ENV.inCODE->first().str() << " |=> " |
| << ENV.mARG->at(0).str() << std::endl; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT) |
| } |
| else |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT) |
| AVM_OS_TRACE << "THROW UNKNOWN SATISFIABILITY OF << EVENT >> : " |
| << ENV.mARG->outED->mRID.strUniqId() << " , " |
| << ENV.inCODE->first().str() << " |=> " |
| << ENV.mARG->at(0).str() << std::endl; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT) |
| |
| return( false ); |
| } |
| |
| return( true ); |
| } |
| |
| |
| /** |
| *************************************************************************** |
| * execution of a CHECK_SAT program |
| *************************************************************************** |
| */ |
| bool AvmPrimitive_CheckSat::run(ExecutionEnvironment & ENV) |
| { |
| if( ENV.mARG->at(0).isBuiltinString() ) |
| { |
| std::string theSolver = ENV.mARG->at(0).toBuiltinString(); |
| |
| AVM_IF_DEBUG_FLAG( STATEMENT_TEST_DECISION ) |
| AVM_OS_TRACE << "checkSat< " << theSolver << " > " |
| << ENV.mARG->at(1).str() << std::endl; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT_TEST_DECISION ) |
| |
| if( ENV.mARG->at(1).isEqualTrue() ) |
| { |
| //!! NO NEED PATH CONDITION UPDATE |
| ENV.appendOutput( ENV.mARG->outED ); |
| } |
| |
| else if( ENV.mARG->at(1).isEqualFalse() ) |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT) |
| AVM_OS_TRACE << "THROW UNSATISFIED << CHECK#SAT >> :> ctx: " |
| << ENV.mARG->outED->mRID.str() << EOL |
| << TAB << "condition: " << ENV.inCODE->str() |
| << " |=> " << ENV.mARG->at(0).str() |
| << EOL_FLUSH; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT) |
| } |
| |
| else if( SolverFactory::isWeakSatisfiable(SolverDef::toSolver( |
| theSolver, SolverDef::DEFAULT_SOLVER_KIND), ENV.mARG->at(1)) ) |
| { |
| //!! NO NEED PATH CONDITION UPDATE |
| ENV.appendOutput( ENV.mARG->outED ); |
| } |
| else |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT) |
| AVM_OS_TRACE << "THROW UNSATISFIED << CHECK#SAT >> :> ctx: " |
| << ENV.mARG->outED->mRID.str() << EOL |
| << TAB << " PC: " |
| << ENV.mARG->outED->getAllPathCondition().str() << EOL |
| << TAB << "condition: " << ENV.inCODE->str() << EOL |
| << TAB << " |=> " << ENV.mARG->at(0).str() |
| << EOL_FLUSH; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT) |
| } |
| |
| return( true ); |
| } |
| |
| |
| else if( SolverFactory::isWeakSatisfiable(ENV.mARG->at(0)) ) |
| { |
| //!! NO NEED PATH CONDITION UPDATE |
| ENV.appendOutput( ENV.mARG->outED ); |
| } |
| else |
| { |
| AVM_IF_DEBUG_FLAG( STATEMENT) |
| AVM_OS_TRACE << "THROW UNSATISFIED << CHECK#SAT >> :> ctx: " |
| << ENV.mARG->outED->mRID.str() << EOL |
| << TAB << " PC: " |
| << ENV.mARG->outED->getAllPathCondition().str() << EOL |
| << TAB << "condition: " << ENV.inCODE->str() << EOL |
| << TAB << " |=> " << ENV.mARG->at(0).str() |
| << EOL_FLUSH; |
| AVM_ENDIF_DEBUG_FLAG( STATEMENT) |
| } |
| |
| return( true ); |
| } |
| |
| |
| } |