enum IfaceWidthDir { LittleEndian = 1, BigEndian}; //! LittleEndian = X downto 0, BigEndian = 0 to X
enum IfacePurpose { AnyPurpose = 0, Data = 1, Control, Clock, Reset, Wishbone };
enum IfaceDirection { AnyDirection = 0, Input = 1, Output = 2, InOut = 3 };
- enum IfaceVHDLContext {AnyContext = 0, Entity = 1, Component = 2, Architecture = 3 }; // NB : 3 is when creating an instance of the block that owns this iface
+ enum IfaceVHDLContext {AnyContext = 0, Entity = 1, Component = 2, Instance = 3, Signal = 4 };
enum IfaceVHDLFlags { NoComma = 1 };
+ enum IfaceClockName { NoName = 0, ClockName, ParameterName };
static int getIntDirection(QString str);
static int getIntPurpose(QString str);
QString getTypeString();
inline int getEndianess() { return endianess; }
QString getEndianessString();
- inline QString getWidth() { return width;}
+ inline QString getWidthString() { return width;}
+ virtual int getWidth(); // return -1 if size cannot be determine
inline int getPurpose() { return purpose;}
QString getPurposeString();
inline int getDirection() { return direction;}
QString getDirectionString();
inline AbstractBlock *getOwner() { return owner;}
inline AbstractInterface* getAssociatedIface() { return associatedIface; }
-
- double getDoubleWidth() throw(QException);
+ inline QString getClockIfaceString() { return clkIface; }
+ inline int getClockIfaceType() { return clkIfaceType; }
+ AbstractInterface* getClockIface();
+ virtual int getClockDomain() throw(Exception) = 0; // determine on which clock domain is sync this interface
+ double getClockFrequency() throw(Exception);
// setters
void setPurpose(int _purpose);
void setDirection(int _direction);
bool setAssociatedIface(AbstractInterface* iface);
+ bool setClockIface(QString name);
// testers
virtual bool isReferenceInterface();
int typeFromString(const QString &_type);
- QString toVHDL(int context, int flags) throw(Exception);
+ QString toVHDL(IfaceVHDLContext context, int flags) throw(Exception);
protected:
QString name;
int direction;
int type;
QString width;
- int endianess;
-
+ int endianess;
AbstractBlock* owner;
/*!
* (NB: a test is done in the method to prevent the other case).
*/
AbstractInterface* associatedIface;
+ /*!
+ * \brief clkIface represents the clock interface that is used in processes modifying this interface. It is only relevant for
+ * Data interfaces and clock outputs (that comes from a clkrstgen). Since Control interfaces are automatically associated to a
+ * Data interface, clkIface is "" for them. Wishbone interfaces
+ * In general, blocks have a single
+ * clock interface which is by default automatically connected to the main clock dispatched by the clkrstgen block in top group.
+ * Nevertheless, the designer has the possibility to connect the block taht owns this interface to another clkrstgen block. Moreover,
+ * some blocks may have several clocks, e.g. dual port RAMs, FIFOs.
+ */
+ QString clkIface;
+ int clkIfaceType; // 0 for not affected, 1 for clock input name, 2 for user param name
};