#ifndef POWERMODEL_H_
#define POWERMODEL_H_

#include <map>
#include <set>
#include "quantities/WiringPath.h"
#include "quantities/onchipcommunication/LinkParameter.h"
#include "quantities/onchipcommunication/Interface.h"
#include "quantities/onchipcommunication/NodeParameter.h"
#include "quantities/onchipcommunication/Ports.h"
#include "quantities/CommoditySet.h"
#include "quantities/Name.h"


namespace cosi {

namespace models {

namespace onchipcommunication {

class LinkPowerModel {
public:
	LinkPowerModel();
	virtual ~LinkPowerModel();

	//LINKS
	virtual double GetDynamicPower(Name pName ,
			cosi::quantity::onchipcommunication::Interface pSource,
			cosi::quantity::onchipcommunication::Interface pDest,
			WiringPath pPath,
			CommoditySet pCommodities ,
			cosi::quantity::onchipcommunication::LinkParameter pParam) = 0 ;
	virtual double GetStaticPower(Name pName ,
				cosi::quantity::onchipcommunication::Interface pSource,
				cosi::quantity::onchipcommunication::Interface pDest,
				WiringPath pPath,
				cosi::quantity::onchipcommunication::LinkParameter pParam)= 0 ;
};

class NodePowerModel {
public:
	NodePowerModel();
	virtual ~NodePowerModel();

	//NODES
	virtual double GetDynamicPower(Name pName, cosi::quantity::onchipcommunication::Ports pPorts,
			std::map< std::string , CommoditySet > pCommodities ,
			cosi::quantity::onchipcommunication::NodeParameter pParam)= 0 ;
	virtual double GetStaticPower(Name pName , cosi::quantity::onchipcommunication::Ports pPorts,
				cosi::quantity::onchipcommunication::NodeParameter pParam)= 0 ;

};

}

}

}

#endif /*POWERMODEL_H_*/
