#ifndef POINTTOPOINTBUS_H_
#define POINTTOPOINTBUS_H_

#include "networks/onchipcommunication/PlatformInstance.h"
#include "networks/onchipcommunication/Implementation.h"
#include "libraries/onchipcommunication/common/Link.h"
#include "quantities/onchipcommunication/Interface.h"
#include "models/onchipcommunication/common/AreaModel.h"
#include "models/onchipcommunication/common/PowerModel.h"
#include "include/onchipcommunication/typedefs.h"
#include "quantities/onchipcommunication/LinkParameter.h"
#include "quantities/onchipcommunication/NodeParameter.h"


namespace cosi {

namespace library {

namespace onchipcommunication {

class PointToPointBus : public Link {

	cosi::quantity::onchipcommunication::LinkParameter* mParam;
public:
	//technology and paramters
	PointToPointBus(int Width , Technology pTech);

	virtual ~PointToPointBus();


	double GetDeviceArea(WiringPath P);

	double GetWiringArea(WiringPath P);

	double GetStaticPower(WiringPath P);

	double GetDynamicPower(WiringPath P, CommoditySet pCommodities);

	double GetDelay(WiringPath P) ;

	cosi::commstruct::onchipcommunication::PlatformInstance
			* GetPlatformInstance(int U, std::string pPortsU, int V,
					std::string pPortV) ;

	cosi::commstruct::onchipcommunication::Implementation
			* GetImplementationInstance(int U, std::string pPortsU, int V,
					std::string pPortV, WiringPath pPath) ;

	cosi::commstruct::onchipcommunication::Implementation
			* GetImplementationInstance(int U, std::string pPortsU, int V,
					std::string pPortV, WiringPath pPath,
					CommoditySet pCommodities);

	static std::string ComponentName;
	static std::string ComponentType;

	 std::string GetComponentName()  ;
	 std::string GetComponentType()  ;

};

}

}

}

#endif /*POINTTOPOINTBUS_H_*/
