#ifndef LIBRARIES_WIREDBAS_COMMON_LINK_H_
#define LIBRARIES_WIREDBAS_COMMON_LINK_H_

#include "Node.h"
#include "InstantiableLink.h"
#include "quantities/WiringPath.h"
#include "quantities/CommoditySet.h"
#include "models/onchipcommunication/common/AreaModel.h"
#include "models/onchipcommunication/common/PowerModel.h"
#include "models/onchipcommunication/common/DelayModel.h"

namespace cosi {

namespace library {

namespace onchipcommunication {

class Link : public cosi::library::onchipcommunication::InstantiableLink {
protected:
	cosi::models::onchipcommunication::LinkAreaModel* mAreaModel;
	cosi::models::onchipcommunication::LinkPowerModel* mPowerModel;
	cosi::models::onchipcommunication::LinkDelayModel* mDelayModel;

public:
	Link();
	virtual ~Link();

	void SetAreaModel(cosi::models::onchipcommunication::LinkAreaModel* pModel);

	void
			SetPowerModel(
					cosi::models::onchipcommunication::LinkPowerModel* pModel);

	void
				SetDelayModel(
						cosi::models::onchipcommunication::LinkDelayModel* pModel);


	//COST METRICS
	virtual double GetDeviceArea(WiringPath P) = 0;
	virtual double GetWiringArea(WiringPath P) = 0;
	virtual double GetStaticPower(WiringPath P) = 0;
	virtual double GetDynamicPower(WiringPath P, CommoditySet pCommodities) = 0;


	//PERFORMANCE METRICS
	virtual double GetDelay(WiringPath P) = 0;

	virtual std::string GetComponentName() = 0;
	virtual std::string GetComponentType() = 0;

};

}

}

}

#endif /*LINK_H_*/
