blob: f589d9609413cc40831009766f70bd1ee3c1dfd9 [file] [log] [blame]
/*******************************************************************************
* 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 );
}
}