#ifndef PROJECTPARSER_H_
#define PROJECTPARSER_H_

#include <vector>
#include <string>
#include <iostream>
#include "tinyxml.h"

namespace cosi {

namespace io {

namespace onchipcommunication {

using namespace std ;

class ProjectParser {
public:

    ProjectParser( string pFname ) ;

    void Parse( ) ;

    string GetLibraryFileName( ) ;
    string GetConstraintFileName( ) ;
    string GetProjectName( ) ;
    string GetPlacementFileName( ) ;

    bool WireModelDefined( ) ;
    string GetWireFileName( ) ;

    bool BufferModelDefined( ) ;
    string GetBufferFileName( ) ;

    string GetWireLayer( ) ;
    string GetWireSpacing( ) ;
    string GetWireBuffering( ) ;
    bool GetWireShielding( ) ;


    string GetLibraryName( ) ;

    double GetSpareArea( ) ;
    double GetTotalArea( ) ;
    double GetStep( ) ;
    int GetFlitWidth( ) ;
    double GetSwitchingFactor( ) ;
    int GetMaxInDegree( ) ;
    int GetMaxOutDegree( ) ;
    int GetSourceOutDegree( ) ;
    int GetDestInDegree( ) ;
    double GetPowerVsArea( ) ;
    int GetDensity( ) ;
    int GetPruneLines( ) ;
    bool AllowPtP( ) ;
    bool AllowTwoHops( ) ;
    bool UsePlacement( ) ;
    bool RunTimeDeadlockCheck( ) ;
    bool HasHopConstraints( ) ;
    bool HasAreaConstraint( ) ;
    bool UseKmedian() ;
    bool RunTimeBackTrack() ;
    int Kmin() ;
    int Kmax() ;

    bool ReportRequest( ) ;
    bool TabAppendRequest( ) ;
    bool SvgRequest( ) ;
    bool DotRequest( ) ;
    bool SystemCRequest( ) ;
    bool OtterRequest( ) ;


    string GetReportFileName( ) ;
    string GetTabAppendFileName( );
    string GetSvgFileName( ) ;
    string GetDotFileName( ) ;
    string GetSystemCFileName( ) ;
    string GetSystemCcppFileName( ) ;
    string GetSystemCMakeFileName( ) ;
    string GetOtterFileName( ) ;
    string GetCosiRoot( ) ;
    string GetSystemCRoot( ) ;


private:


    void ParseNode( TiXmlNode* Parent ) ;

    void GetProjectAttributes( TiXmlNode* pParent ) ;

    void GetLibraryAttributes( TiXmlNode* pParent ) ;

    void GetConstraintsAttributes( TiXmlNode* pParent ) ;

    void GetParametersAttributes( TiXmlNode* pParent ) ;

    void GetOutputAttributes( TiXmlNode* pParent ) ;

    void GetSvgAttributes( TiXmlNode* pParent ) ;

    void GetSystemCAttributes( TiXmlNode* pParent ) ;

    void GetDotAttributes( TiXmlNode* pParent ) ;

    void GetOtterAttributes( TiXmlNode* pParent ) ;

    void GetReportAttributes( TiXmlNode* pParent ) ;

    void GetTabAppendAttributes( TiXmlNode* pParent ) ;

    string mProjectName ;
    string mFname ;
    string mLibraryFileName ;
    bool mLibraryDefined ;
    string mConstraintFileName ;
    bool mConstraintDefined ;
    string mPlacementFileName ;

    string mWireModelFileName ;
    bool mWireModelDefined ;
    string mBufferModelFileName ;
    bool mBufferModelDefined ;
    string mWireLayer ;
    string mWireSpacing ;
    string mWireBuffering ;
    bool mWireShielding ;

    string mReportFileName ;
    string mTabAppendFileName ;
    string mSvgFileName ;
    string mDotFileName ;
    string mOtterFileName ;
    string mSystemCfileName ;
    string mMakeFileName ;

    string mCosiRoot ;
    string mSystemCroot ;
    string mInputDir ;
    string mOutputDir ;
    string mLibraryName;

    double mSpareA ;
    double mTotalA ;
    double mStep ;
    int mFlitWidth ;
    double mSwitchingFactor ;
    int mMaxInDegree ;
    int mMaxOutDegree ;
    int mSourceOutDegree ;
    int mDestInDegree ;
    double mPowerVsArea ;
    int mPruneLines ;
    int mDensity ;
    bool mAllowPtP ;
    bool mAllowTwoHops ;
    bool mRunTimeDeadlockCheck ;
    bool mHopConstraints ;
    bool mAreaConstraint ;
	bool mUsePlacement ;
	bool mUseKmedian ;
	int mKmin ;
	int mKmax ;
	bool mRunTimeBackTrack ;


    bool mReport ;
    bool mTabAppend ;
    bool mSvg ;
    bool mSystemC ;
    bool mDot ;
    bool mOtter ;




} ;

}
}
}

#endif /*PROJECTPARSER_H_*/
