blob: 422fe9b74b80147fb75469b9b01b0443d7f775b6 [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: 28 nov. 2011
*
* Contributors:
* Arnault Lapitre (CEA LIST) arnault.lapitre@cea.fr
* - Initial API and implementation
******************************************************************************/
#ifndef ABSTRACTPROCESSORUNIT_H_
#define ABSTRACTPROCESSORUNIT_H_
#include <common/RunnableElement.h>
#include <fam/api/IProcessorUnitTest.h>
#include <fam/api/ProcessorUnitAutoRegistration.h>
#include <computer/EvaluationEnvironment.h>
#include <fml/runtime/ExecutionContext.h>
#include <fml/workflow/WObject.h>
namespace sep
{
typedef avm_uint8_t avm_computing_process_stage_t;
enum {
AVM_UNDEFINED_STAGE = 0x0000,
AVM_PRE_PROCESSING_STAGE = 0x0001,
AVM_POST_PROCESSING_STAGE = 0x0002,
AVM_PREPOST_PROCESSING_STAGE = AVM_PRE_PROCESSING_STAGE
| AVM_POST_PROCESSING_STAGE,
AVM_PRE_FILTERING_STAGE = 0x0004,
AVM_POST_FILTERING_STAGE = 0x0008,
AVM_PREPOST_FILTERING_STAGE = AVM_PRE_FILTERING_STAGE
| AVM_POST_FILTERING_STAGE,
AVM_COMPUTING_ALL_STAGE = AVM_PREPOST_PROCESSING_STAGE
| AVM_PREPOST_FILTERING_STAGE,
AVM_COMPUTING_COMPOSITE_STAGE = 0x0010,
};
class WaitingStrategy;
class AvmPrimitiveProcessor;
class Builder;
class Configuration;
class ExecutableForm;
class ExecutionContext;
class ExecutionQueue;
class MainProcessorUnit;
class SymbexDispatcher;
class SymbexControllerRequestManager;
class SymbexControllerUnitManager;
class SymbexEngine;
class SymbexEventManager;
////////////////////////////////////////////////////////////////////////////////
// FORMAL ANALYSIS MODULE POINTER
////////////////////////////////////////////////////////////////////////////////
class AbstractProcessorUnit :
public RunnableElement ,
public IProcessorUnitTest ,
AVM_INJECT_INSTANCE_COUNTER_CLASS( AbstractProcessorUnit )
{
public:
/**
* PROCESSOR FACTORY
* for automatic registration in the processor repository
*/
virtual const IProcessorUnitRegistration & REGISTER_TOOL() const = 0;
inline bool isRegisterTool(
const IProcessorUnitRegistration & aRegisterTool) const
{
return( REGISTER_TOOL().isEquals( aRegisterTool ) );
}
protected:
/**
* ATTRIBUTES
*/
SymbexControllerUnitManager & mControllerUnitManager;
EvaluationEnvironment ENV;
avm_computing_process_stage_t mComputingStageRequired;
avm_computing_process_stage_t mComputingStageEnabled;
bool mAutoConfigure;
bool mAutoStart;
avm_uint8_t mPrecedenceOfPreProcess;
avm_uint8_t mPrecedenceOfPostProcess;
avm_uint8_t mPrecedenceOfInitFilter;
avm_uint8_t mPrecedenceOfPreFilter;
avm_uint8_t mPrecedenceOfPostFilter;
avm_size_t mBeginningStepTimout;
avm_size_t mSliceCount;
// For eval / report Trace format
std::string mPreEvalTraceFormatter;
std::string mPostEvalTraceFormatter;
std::string mBoundEvalTraceFormatter;
std::string mReportEvalTraceFormatter;
////////////////////////////////////////////////////////////////////////////
// Computing Variables
ListOfExecutionContext * ecQueue;
ListOfExecutionContext::iterator ecQueueIt;
ListOfExecutionContext::iterator ecQueueItEnd;
ExecutionContext::rw_child_iterator ecChildIt;
ExecutionContext::rw_child_iterator ecChildItEnd;
public:
/*
* Precedence for processor, based on resource consumption,
* used to order processor in the Diversity process !
* For info: 0 for minimum resource requirement reserved by STOP CRITERIA FILTER,
* and 255 maximum value for example REDUNDANCY FILTER
* Default value is the max !
* Processing: pre = 255 , post = 255
* Filtering : init = 255
* Filtering : pre = 255 , post = 255
*/
static const avm_uint8_t DEFAULT_PRECEDENCE_OF_PROCESSOR[5];
static const avm_uint8_t DEFAULT_PRECEDENCE_OF_MAIN_PROCESSOR[5];
static const avm_uint8_t PRECEDENCE_OF_ACTIVE_COVERAGE_PROCESSOR[5];
static const avm_uint8_t PRECEDENCE_OF_PASSIVE_COVERAGE_PROCESSOR[5];
static const avm_uint8_t PRECEDENCE_OF_MAIN_PROCESSOR[5];
static const avm_uint8_t PRECEDENCE_OF_EXTENDER_PROCESSOR[5];
static const avm_uint8_t PRECEDENCE_OF_REDUNDANCY[5];
static const avm_uint8_t PRECEDENCE_OF_TRANSITION_COVERAGE[5];
static const avm_uint8_t PRECEDENCE_OF_HIT_OR_JUMP[5];
static const avm_uint8_t PRECEDENCE_OF_FORMULA_COVERAGE[5];
static const avm_uint8_t PRECEDENCE_OF_MACHINE_COVERAGE[5];
static const avm_uint8_t PRECEDENCE_OF_TEST_OFFLINE[5];
static const avm_uint8_t DEFAULT_PRECEDENCE_OF_SERIALIZER_PROCESSOR[5];
/**
* CONSTRUCTOR
* Default
*/
AbstractProcessorUnit(
SymbexControllerUnitManager & aManager, WObject * wfParameterObject,
avm_computing_process_stage_t requiredStage,
const avm_uint8_t * aPrecedence = DEFAULT_PRECEDENCE_OF_PROCESSOR);
AbstractProcessorUnit(
SymbexControllerUnitManager & aManager, WObject * wfParameterObject,
const avm_uint8_t * aPrecedence = DEFAULT_PRECEDENCE_OF_PROCESSOR);
/**
* CONSTRUCTOR
* Other
*/
AbstractProcessorUnit(class_kind_t aClassKind,
SymbexControllerUnitManager & aManager, WObject * wfParameterObject);
AbstractProcessorUnit(class_kind_t aClassKind, SymbexEngine & anEngine,
SymbexControllerUnitManager & aManager, WObject * wfParameterObject);
/**
* DESTRUCTOR
*/
virtual ~AbstractProcessorUnit()
{
//!! NOTHING
}
/**
* GETTERS
* mPrecedenceOfPreProcess
* mPrecedenceOfPostProcess
*/
avm_uint8_t getPrecedenceOfPreProcess() const
{
return mPrecedenceOfPreProcess;
}
avm_uint8_t getPrecedenceOfPostProcess() const
{
return mPrecedenceOfPostProcess;
}
/**
* GETTERS
* mPrecedenceOfInitFilter
* mPrecedenceOfPreFilter
* mPrecedenceOfPostFilter
*/
avm_uint8_t getPrecedenceOfInitFilter() const
{
return mPrecedenceOfInitFilter;
}
avm_uint8_t getPrecedenceOfPreFilter() const
{
return mPrecedenceOfPreFilter;
}
avm_uint8_t getPrecedenceOfPostFilter() const
{
return mPrecedenceOfPostFilter;
}
/**
* new local ExecutableForm for ProcessorT usage
*/
ExecutableForm * newLocalExecutableForm();
/**
* GETTER
* mProcessorManager
*/
inline SymbexControllerUnitManager & getControllerUnitManager()
{
return( mControllerUnitManager );
}
inline const SymbexControllerUnitManager & getControllerUnitManager() const
{
return( mControllerUnitManager );
}
/**
* GETTER
* SymbexEngine
* Configuration
* SymbexDispatcher
*
*/
SymbexEngine & getSymbexEngine() const;
Configuration & getConfiguration() const;
SymbexDispatcher & getSymbexDispatcher() const;
SymbexEventManager & getSymbexEventManager() const;
SymbexControllerRequestManager & getSymbexRequestManager() const;
// /**
// * GETTER
// * mProcessorManager
// */
// MainProcessorUnit & getMainProcessor();
//
// const MainProcessorUnit & getMainProcessor() const;
//
//
// /**
// * GETTER
// * the Builder
// */
// Builder & getBuilder();
//
// /**
// * GETTER
// * AvmPrimitiveProcessor
// */
// AvmPrimitiveProcessor & getPrimitiveProcessor();
/**
* GETTER - SETTER
* theExecutionQueue
*/
ExecutionQueue & getExecutionQueue();
/**
* GETTER
* EvaluationEnvironment ENV
*/
inline EvaluationEnvironment & getENV()
{
return( ENV );
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// PLUGIN PROCESSOR KIND
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* GETTER
* mAutoConfigure
*/
inline bool isAutoConfigure() const
{
return( mAutoConfigure );
}
/**
* GETTER - SETTER
* mComputingStageEnabled
*/
#define DISABLE_PLUGIN( kind , FLAG ) kind &= ( ~ ( FLAG ) )
#define ENABLE_PLUGIN( kind , FLAG ) kind |= ( FLAG )
#define IS_DISABLE_PLUGIN( kind , FLAG ) ( (kind & ( FLAG )) == 0 )
#define IS_ENABLE_PLUGIN( kind , FLAG ) ( (kind & ( FLAG )) != 0 )
#define IS_STRONG_ENABLE_PLUGIN( kind , FLAG ) ( (kind & ( FLAG )) == ( FLAG ) )
inline void enablePlugin(avm_computing_process_stage_t requiredStage,
bool bEnabled = true)
{
if( bEnabled )
{
ENABLE_PLUGIN( mComputingStageEnabled , requiredStage );
}
else
{
DISABLE_PLUGIN( mComputingStageEnabled , requiredStage );
}
}
inline bool isDisablePlugin() const
{
return( mComputingStageEnabled == AVM_UNDEFINED_STAGE );
}
inline bool isEnablePlugin() const
{
return( mComputingStageEnabled != AVM_UNDEFINED_STAGE );
}
inline bool isDisablePlugin(
avm_computing_process_stage_t requiredStage) const
{
return( IS_DISABLE_PLUGIN(
mComputingStageEnabled, requiredStage) );
}
inline bool isEnablePlugin(
avm_computing_process_stage_t requiredStage) const
{
return( IS_STRONG_ENABLE_PLUGIN(
mComputingStageEnabled, requiredStage) );
}
////////////////////////////////////////////////////////////////////////////
// PRE PROCESS
////////////////////////////////////////////////////////////////////////////
inline void enablePreprocess(bool bEnabled = true)
{
enablePlugin( AVM_PRE_PROCESSING_STAGE , bEnabled );
}
void enablePreprocess(AbstractProcessorUnit * aProcessor);
inline bool isDisablePreprocess() const
{
return( IS_DISABLE_PLUGIN(
mComputingStageEnabled, AVM_PRE_PROCESSING_STAGE) );
}
inline bool isEnablePreprocess() const
{
return( IS_STRONG_ENABLE_PLUGIN(
mComputingStageEnabled, AVM_PRE_PROCESSING_STAGE) );
}
// POST PROCESS
inline void enablePostprocess(bool bEnabled = true)
{
enablePlugin( AVM_POST_PROCESSING_STAGE , bEnabled );
}
void enablePostprocess(AbstractProcessorUnit * aProcessor);
inline bool isEnablePostprocess() const
{
return( IS_STRONG_ENABLE_PLUGIN(
mComputingStageEnabled, AVM_POST_PROCESSING_STAGE) );
}
inline bool isDisablePostprocess() const
{
return( IS_DISABLE_PLUGIN(
mComputingStageEnabled, AVM_POST_PROCESSING_STAGE) );
}
// PROCESS
inline void enableProcess(bool bEnabled)
{
enablePlugin( AVM_PREPOST_PROCESSING_STAGE , bEnabled );
}
inline bool isStrongDisableProcess() const
{
return( IS_DISABLE_PLUGIN(
mComputingStageEnabled, AVM_PREPOST_PROCESSING_STAGE) );
}
inline bool isStrongEnableProcess() const
{
return( IS_STRONG_ENABLE_PLUGIN(
mComputingStageEnabled, AVM_PREPOST_PROCESSING_STAGE) );
}
inline bool isWeakEnableProcess() const
{
return( IS_ENABLE_PLUGIN(
mComputingStageEnabled, AVM_PREPOST_PROCESSING_STAGE) );
}
////////////////////////////////////////////////////////////////////////////
// PRE FILTER
////////////////////////////////////////////////////////////////////////////
inline void enablePrefilter(bool bEnabled = true)
{
enablePlugin( AVM_PRE_FILTERING_STAGE , bEnabled );
}
void enablePrefilter(AbstractProcessorUnit * aProcessor);
inline bool isDisablePrefilter() const
{
return( IS_DISABLE_PLUGIN(
mComputingStageEnabled, AVM_PRE_FILTERING_STAGE) );
}
inline bool isEnablePrefilter() const
{
return( IS_STRONG_ENABLE_PLUGIN(
mComputingStageEnabled, AVM_PRE_FILTERING_STAGE) );
}
// POST FILTER
inline void enablePostfilter(bool bEnabled = true)
{
enablePlugin( AVM_POST_FILTERING_STAGE , bEnabled );
}
void enablePostfilter(AbstractProcessorUnit * aProcessor);
inline bool isEnablePostfilter() const
{
return( IS_STRONG_ENABLE_PLUGIN(
mComputingStageEnabled, AVM_POST_FILTERING_STAGE) );
}
inline bool isDisablePostfilter() const
{
return( IS_DISABLE_PLUGIN(
mComputingStageEnabled, AVM_POST_FILTERING_STAGE) );
}
// FILTER
inline void enableFilter(bool bEnabled)
{
enablePlugin( AVM_PREPOST_FILTERING_STAGE , bEnabled );
}
inline bool isDisableFilter() const
{
return( IS_DISABLE_PLUGIN(
mComputingStageEnabled, AVM_PREPOST_FILTERING_STAGE) );
}
inline bool isStrongEnableFilter() const
{
return( IS_STRONG_ENABLE_PLUGIN(
mComputingStageEnabled, AVM_PREPOST_FILTERING_STAGE) );
}
inline bool requiresStrongEnableFilter() const
{
return( IS_STRONG_ENABLE_PLUGIN(
mComputingStageRequired, AVM_PREPOST_FILTERING_STAGE) );
}
inline bool isWeakEnableFilter() const
{
return( IS_ENABLE_PLUGIN(
mComputingStageEnabled, AVM_PREPOST_FILTERING_STAGE) );
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
// PLUGIN PROCESSOR API
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
/**
* FORMATTER
*/
inline virtual std::string getDefaultPreEvalTraceFormatter() const
{
return( "" );
}
inline virtual std::string getDefaultPostEvalTraceFormatter() const
{
return( "" );
}
inline virtual std::string getDefaultBoundEvalTraceFormatter() const
{
return( "" );
}
inline virtual std::string getDefaultReportEvalTraceFormatter() const
{
return( "" );
}
////////////////////////////////////////////////////////////////////////////
// CONFIGURE API
////////////////////////////////////////////////////////////////////////////
virtual bool preConfigure();
virtual bool configure();
virtual bool configureImpl() = 0;
bool configureCommon();
bool configureLog();
bool checkingConfiguration();
/**
* API
* Auto configure Model Of Execution in CPU
*/
virtual bool autoConfigureMOE();
virtual bool autoConfigureMOEImpl();// = 0;
////////////////////////////////////////////////////////////////////////////
// INIT / EXIT API
////////////////////////////////////////////////////////////////////////////
virtual bool initImpl()
{
//!! NOTHING
return true;
}
virtual bool exitImpl()
{
//!! NOTHING
return true;
}
////////////////////////////////////////////////////////////////////////////
// FILTERING API
////////////////////////////////////////////////////////////////////////////
inline virtual bool filteringInitialize()
{
//!! NOTHING
return( true );
}
inline virtual bool filteringFinalize()
{
//!! NOTHING
return( true );
}
virtual bool prefilter();
inline virtual bool prefilter(ExecutionContext & anEC)
{
//!! NOTHING
return( true );
}
virtual bool postfilter();
inline virtual bool postfilter(ExecutionContext & anEC)
{
//!! NOTHING
return( true );
}
/**
* REPORT
*/
void reportHeader(OutStream & os, const std::string & processorName) const;
virtual void reportDefault(OutStream & os) const;
/**
* EVAL TRACE
*/
inline virtual void tracePreEval(
OutStream & os, const ExecutionContext & anEC) const
{
AVM_VERBOSITY_SWITCH_SILENT
traceSilentPreEval(os, anEC);
AVM_VERBOSITY_SWITCH_CASE_MINIMUM
traceMinimumPreEval(os, anEC);
AVM_VERBOSITY_SWITCH_CASE_MEDIUM
traceMediumPreEval(os, anEC);
AVM_VERBOSITY_SWITCH_CASE_MAXIMUM
traceMaximumPreEval(os, anEC);
AVM_VERBOSITY_SWITCH_END
}
inline virtual void traceSilentPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
// SILENT => NOTHING
}
inline virtual void traceMinimumPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
traceDefaultPreEval(os, anEC);
}
inline virtual void traceMediumPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
traceDefaultPreEval(os, anEC);
}
inline virtual void traceMaximumPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
traceDefaultPreEval(os, anEC);
}
inline virtual void traceDefaultPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
//!! NOTHING
}
inline virtual void tracePostEval(
OutStream & os, const ExecutionContext & anEC) const
{
AVM_VERBOSITY_SWITCH_SILENT
traceSilentPostEval(os, anEC);
AVM_VERBOSITY_SWITCH_CASE_MINIMUM
traceMinimumPostEval(os, anEC);
AVM_VERBOSITY_SWITCH_CASE_MEDIUM
traceMediumPostEval(os, anEC);
AVM_VERBOSITY_SWITCH_CASE_MAXIMUM
traceMaximumPostEval(os, anEC);
AVM_VERBOSITY_SWITCH_END
}
inline virtual void traceSilentPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
// SILENT => NOTHING
}
inline virtual void traceMinimumPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
traceDefaultPostEval(os, anEC);
}
inline virtual void traceMediumPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
traceDefaultPostEval(os, anEC);
}
inline virtual void traceMaximumPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
traceDefaultPostEval(os, anEC);
}
inline virtual void traceDefaultPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
//!! NOTHING
}
inline virtual void traceBoundEval(OutStream & os) const
{
//!! NOTHING
}
inline virtual void reportEval(OutStream & os) const
{
//!! NOTHING
}
////////////////////////////////////////////////////////////////////////////
// PROCESSOR REQUEST API
////////////////////////////////////////////////////////////////////////////
/**
* STOP | RELEASE
* RESET | RESTART | CONTINUE
* REQUEUE_WAITING | REQUEUE_RESERVE
* HEURISTIC | GOAL_ACHIEVED
*/
inline virtual void handleRequestStop()
{
//!! NOTHING
}
inline virtual void handleRequestRelease()
{
RunnableElement::setLifecycleReleased();
}
inline virtual void handleRequestReset()
{
//!! NOTHING
}
inline virtual void handleRequestRestart()
{
//!! NOTHING
}
inline virtual void handleRequestContinue()
{
//!! NOTHING
}
// the Waiting Queue Table
inline virtual void handleRequestRequeueWaitingTable(
WaitingStrategy & aWaitingStrategy,
avm_uint8_t aWeightMin, avm_uint8_t aWeightMax)
{
//!! NOTHING
}
virtual void handleRequestRequeueReserveTable(
WaitingStrategy & aWaitingStrategy,
ListOfExecutionContext & aReserveQueue,
avm_uint8_t aWeightMin, avm_uint8_t aWeightMax);
inline virtual void handleRequestHeuristic()
{
//!! NOTHING
}
inline virtual void handleRequestGoalAchieved()
{
//!! NOTHING
}
////////////////////////////////////////////////////////////////////////////
// REMOVE EC TOOLS
////////////////////////////////////////////////////////////////////////////
avm_size_t remove(ExecutionContext * anEC,
OutStream & logger = AVM_OS_TRACE, const std::string & msg = "");
////////////////////////////////////////////////////////////////////////////
// FINAL SLICING TOOLS
////////////////////////////////////////////////////////////////////////////
virtual bool isSliceableContext(ExecutionContext & anEC) const;
void computeLeafEC(const ListOfExecutionContext & listOfEC,
ListOfExecutionContext & listOfLeafEC);
void slice(ListOfExecutionContext & listOfLeafEC);
void slice(ListOfExecutionContext & listOfLeafEC,
ExecutionContext * leafEC);
////////////////////////////////////////////////////////////////////////////
// SERIALIZATION API
////////////////////////////////////////////////////////////////////////////
virtual std::string strTypeId() const
{
return( OSS() << "[p:" << (int)mPrecedenceOfPreProcess << ']'
<< ( (mParameterWObject == WObject::_NULL_)
? "fqn<process#unknown>"
: mParameterWObject->hasQualifiedTypeNameID()
? mParameterWObject->getQualifiedTypeNameID()
: mParameterWObject->strUniqId() ) );
}
virtual std::string strUniqId() const
{
return( OSS() << "[p:" << (int)mPrecedenceOfPreProcess << ']'
<< ( (mParameterWObject == NULL)
? strFQN("null<WObject>")
: mParameterWObject->strFQN("<unamed-fam>") ) );
}
virtual void toStream(OutStream & os) const
{
if( mParameterWObject != NULL )
{
mParameterWObject->toStream(os);
}
else
{
os << TAB << "null<WObject as Parameter>" << EOL;
}
}
};
////////////////////////////////////////////////////////////////////////////////
// FORMAL ANALYSIS MODULE SMART POINTER
////////////////////////////////////////////////////////////////////////////////
class FAM :
public SmartPointer< AbstractProcessorUnit , DestroyElementPolicy >,
AVM_INJECT_INSTANCE_COUNTER_CLASS( FAM )
{
private:
/**
* TYPEDEF
*/
typedef SmartPointer< AbstractProcessorUnit ,
DestroyElementPolicy > base_this_type;
public:
/**
* CONSTRUCTOR
* Default
*/
FAM()
: base_this_type( )
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Default
*/
explicit FAM(AbstractProcessorUnit * aFAM)
: base_this_type( aFAM )
{
//!! NOTHING
}
public:
/**
* DESTRUCTOR
*/
virtual ~FAM()
{
//!! NOTHING
}
////////////////////////////////////////////////////////////////////////////
// COMPUTING STAGE ENABLED API
////////////////////////////////////////////////////////////////////////////
inline void enablePlugin(
avm_computing_process_stage_t requiredStage,
bool bEnabled = true)
{
mPTR->enablePlugin(requiredStage, bEnabled);
}
inline bool isDisablePlugin() const
{
return( mPTR->isDisablePlugin() );
}
inline bool isEnablePlugin() const
{
return( mPTR->isEnablePlugin() );
}
inline bool isEnablePreprocess() const
{
return( mPTR->isEnablePreprocess() );
}
inline bool isEnablePostprocess() const
{
return( mPTR->isEnablePostprocess() );
}
inline bool isEnablePrefilter() const
{
return( mPTR->isEnablePrefilter() );
}
inline bool isEnablePostfilter() const
{
return( mPTR->isEnablePostfilter() );
}
inline bool isWeakEnableFilter() const
{
return( mPTR->isWeakEnableFilter() );
}
////////////////////////////////////////////////////////////////////////////
// CONFIGURE API
////////////////////////////////////////////////////////////////////////////
inline WObject * getParameterWObject() const
{
return mPTR->getParameterWObject();
}
inline bool configure()
{
return mPTR->configure();
}
////////////////////////////////////////////////////////////////////////////
// INIT / EXIT API
////////////////////////////////////////////////////////////////////////////
inline bool init()
{
return mPTR->init();
}
inline bool exit()
{
return mPTR->exit();
}
////////////////////////////////////////////////////////////////////////////
// ( PRE / POST ) PROCESS API
////////////////////////////////////////////////////////////////////////////
inline bool preprocess()
{
return mPTR->preprocess();
}
inline bool postprocess()
{
return mPTR->postprocess();
}
////////////////////////////////////////////////////////////////////////////
// FILTERING API
////////////////////////////////////////////////////////////////////////////
inline bool filteringInitialize()
{
return mPTR->filteringInitialize();
}
inline bool filteringFinalize()
{
return mPTR->filteringFinalize();
}
////////////////////////////////////////////////////////////////////////////
// ( PRE / POST ) FILTER API
////////////////////////////////////////////////////////////////////////////
inline bool prefilter()
{
return mPTR->prefilter();
}
inline bool prefilter(ExecutionContext & anEC)
{
return mPTR->prefilter( anEC );
}
inline bool postfilter()
{
return mPTR->postfilter();
}
inline bool postfilter(ExecutionContext & anEC)
{
return mPTR->postfilter( anEC );
}
////////////////////////////////////////////////////////////////////////////
// REPORT API
////////////////////////////////////////////////////////////////////////////
inline void report(OutStream & os) const
{
mPTR->report( os );
}
////////////////////////////////////////////////////////////////////////////
// UNIT TEST API
////////////////////////////////////////////////////////////////////////////
inline void tddUnitReport(OutStream & os) const
{
mPTR->tddUnitReport( os );
}
////////////////////////////////////////////////////////////////////////////
// NON-REGRESSION TEST API
////////////////////////////////////////////////////////////////////////////
inline void tddRegressionReport(OutStream & os) const
{
mPTR->tddRegressionReport( os );
}
/**
* REPORT
*/
inline void reportHeader(
OutStream & os, const std::string & processorName) const
{
mPTR->reportHeader(os, processorName);
}
/**
* EVAL TRACE
*/
inline void tracePreEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->tracePreEval(os, anEC);
}
inline void traceSilentPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceSilentPreEval(os, anEC);
}
inline void traceMinimumPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceMinimumPreEval(os, anEC);
}
inline void traceMediumPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceMediumPreEval(os, anEC);
}
inline void traceMaximumPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceMaximumPreEval(os, anEC);
}
inline void traceDefaultPreEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceDefaultPreEval(os, anEC);
}
inline void tracePostEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->tracePostEval(os, anEC);
}
inline void traceSilentPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceSilentPostEval(os, anEC);
}
inline void traceMinimumPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceMinimumPostEval(os, anEC);
}
inline void traceMediumPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceMediumPostEval(os, anEC);
}
inline void traceMaximumPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceMaximumPostEval(os, anEC);
}
inline void traceDefaultPostEval(
OutStream & os, const ExecutionContext & anEC) const
{
mPTR->traceDefaultPostEval(os, anEC);
}
inline void traceBoundEval(OutStream & os) const
{
mPTR->traceBoundEval( os );
}
inline void reportEval(OutStream & os) const
{
mPTR->reportEval( os );
}
////////////////////////////////////////////////////////////////////////////
// PROCESSOR REQUEST API
////////////////////////////////////////////////////////////////////////////
/**
* STOP | RELEASE
* RESET | RESTART | CONTINUE
* REQUEUE_WAITING | REQUEUE_RESERVE
* HEURISTIC | GOAL_ACHIEVED
*/
inline virtual void handleRequestStop()
{
mPTR->handleRequestStop();
}
inline virtual void handleRequestRelease()
{
mPTR->handleRequestRelease();
}
inline virtual void handleRequestReset()
{
mPTR->handleRequestReset();
}
inline virtual void handleRequestRestart()
{
mPTR->handleRequestRestart();
}
inline virtual void handleRequestContinue()
{
mPTR->handleRequestContinue();
}
// the Waiting Queue Table
inline virtual void handleRequestRequeueWaitingTable(
WaitingStrategy & aWaitingStrategy,
avm_uint8_t aWeightMin, avm_uint8_t aWeightMax)
{
mPTR->handleRequestRequeueWaitingTable(
aWaitingStrategy, aWeightMin, aWeightMax);
}
virtual void handleRequestRequeueReserveTable(
WaitingStrategy & aWaitingStrategy,
ListOfExecutionContext & aReserveQueue,
avm_uint8_t aWeightMin, avm_uint8_t aWeightMax)
{
mPTR->handleRequestRequeueReserveTable(
aWaitingStrategy, aReserveQueue, aWeightMin, aWeightMax);
}
inline virtual void handleRequestHeuristic()
{
mPTR->handleRequestHeuristic();
}
inline virtual void handleRequestGoalAchieved()
{
mPTR->handleRequestGoalAchieved();
}
////////////////////////////////////////////////////////////////////////////
// SERIALIZATION API
////////////////////////////////////////////////////////////////////////////
inline std::string strTypeId() const
{
return mPTR->strTypeId();
}
inline std::string strUniqId() const
{
return mPTR->strUniqId();
}
inline void toStream(OutStream & os) const
{
mPTR->toStream( os );
}
};
////////////////////////////////////////////////////////////////////////////////
// PROCESSOR UNIT AUTO REGISTRATION FACTORY
// for automatic registration in the processor repository
////////////////////////////////////////////////////////////////////////////////
template< class ProcessorT >
class AutoRegisteredProcessorUnit : public AbstractProcessorUnit
{
public:
/**
* TYPDEDEF
*/
typedef AutoRegisteredProcessorUnit< ProcessorT > RegisteredProcessorUnit;
/**
* CONSTRUCTOR
* Default
*/
AutoRegisteredProcessorUnit(SymbexControllerUnitManager & aManager,
WObject * wfParameterObject, avm_computing_process_stage_t requiredStage,
const avm_uint8_t * aPrecedence = DEFAULT_PRECEDENCE_OF_PROCESSOR)
: AbstractProcessorUnit(aManager, wfParameterObject, requiredStage, aPrecedence)
{
//!! NOTHING
}
AutoRegisteredProcessorUnit(
SymbexControllerUnitManager & aManager, WObject * wfParameterObject,
const avm_uint8_t * aPrecedence = DEFAULT_PRECEDENCE_OF_PROCESSOR)
: AbstractProcessorUnit(aManager, wfParameterObject, aPrecedence)
{
//!! NOTHING
}
/**
* CONSTRUCTOR
* Other
*/
AutoRegisteredProcessorUnit(class_kind_t aClassKind,
SymbexControllerUnitManager & aManager, WObject * wfParameterObject)
: AbstractProcessorUnit(aClassKind, aManager, wfParameterObject)
{
//!! NOTHING
}
AutoRegisteredProcessorUnit(class_kind_t aClassKind, SymbexEngine & anEngine,
SymbexControllerUnitManager & aManager, WObject * wfParameterObject)
: AbstractProcessorUnit(aClassKind, anEngine, aManager, wfParameterObject)
{
//!! NOTHING
}
/**
* DESTRUCTOR
*/
virtual ~AutoRegisteredProcessorUnit()
{
// Force Instanciate
(void) & AUTO_REGISTER_TOOL;
}
/**
* PROCESSOR FACTORY
* for automatic registration in the processor repository
*/
static struct AutoRegisterProcessorFactory :
public ProcessorUnitRegistrationImpl< ProcessorT >
{
AutoRegisterProcessorFactory()
: ProcessorUnitRegistrationImpl< ProcessorT >(
ProcessorT::QNID() , ProcessorT::QNID1() ,
ProcessorT::QNID2(), ProcessorT::QNID3() )
{
//!! NOTHING
}
} AUTO_REGISTER_TOOL;
// end registration
inline virtual IProcessorUnitRegistration & REGISTER_TOOL() const
{
return( AUTO_REGISTER_TOOL );
}
inline bool isRegisterTool(
const IProcessorUnitRegistration & aRegisterTool) const
{
return( AUTO_REGISTER_TOOL.isEquals( aRegisterTool ) );
}
};
template< class ProcessorT > typename
AutoRegisteredProcessorUnit< ProcessorT >::AutoRegisterProcessorFactory
AutoRegisteredProcessorUnit< ProcessorT >::AUTO_REGISTER_TOOL;
#define AVM_INJECT_AUTO_REGISTER_QUALIFIED_ID_KEY( qnid ) \
public: \
static std::string QNID () { return( qnid ); } \
static std::string QNID1() { return( "" ); } \
static std::string QNID2() { return( "" ); } \
static std::string QNID3() { return( "" ); }
#define AVM_INJECT_AUTO_REGISTER_QUALIFIED_ID_KEY_2( qnid , qnid1 ) \
public: \
static std::string QNID () { return( qnid ); } \
static std::string QNID1() { return( qnid1 ); } \
static std::string QNID2() { return( "" ); } \
static std::string QNID3() { return( "" ); }
#define AVM_INJECT_AUTO_REGISTER_QUALIFIED_ID_KEY_3( qnid , qnid1 , qnid2 ) \
public: \
static std::string QNID () { return( qnid ); } \
static std::string QNID1() { return( qnid1 ); } \
static std::string QNID2() { return( qnid2 ); } \
static std::string QNID3() { return( "" ); }
#define AVM_INJECT_AUTO_REGISTER_QUALIFIED_ID_KEY_4(qnid, qnid1, qnid2, qnid3) \
public: \
static std::string QNID () { return( qnid ); } \
static std::string QNID1() { return( qnid1 ); } \
static std::string QNID2() { return( qnid2 ); } \
static std::string QNID3() { return( qnid3 ); }
} /* namespace sep */
#endif /* ABSTRACTPROCESSORUNIT_H_ */