selected = false;
currentInterface = NULL;
+ visible = true;
rstClkVisible = false;
wishboneVisible = false;
selected = false;
currentInterface = NULL;
+ visible = true;
rstClkVisible = false;
wishboneVisible = false;
void setRefBlock(AbstractBlock* _refBlock);
inline void setId(int _id){ id = _id; }
inline void setSelected(bool _selected) { selected = _selected; }
+ inline void setVisible(bool state) { visible = state; }
void setRstClkVisible(bool b);
void setWishboneVisible(bool b);
void setDimension(int x, int y);
virtual bool isBoxItem();
virtual bool isGroupItem();
virtual bool isStimuliItem();
+ inline bool isVisible() { return visible; }
inline bool isSelected() { return selected; }
inline bool isRstClkVisible(){ return rstClkVisible;}
inline bool isWishboneVisible(){ return wishboneVisible;}
int lock;
bool selected;
+ bool visible; //! true if the box is shown
bool rstClkVisible; //! true if clock/reset interfaces are visible
bool wishboneVisible; //! true if wishbone interfaces are visible
cout << "adding block to scene " << v.toInt() << endl;
QHash<QString, int> clkRstToGen;
- for(int i=1;i<nbClock+nbRst;i++) {
+ for(int i=1;i<=nbClock+nbRst;i++) {
QLayoutItem* item = layClkRst->itemAtPosition(i,0);
QLabel* lab = (QLabel *)(item->widget());
item = layClkRst->itemAtPosition(i,1);
}
void BoxItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
+
+ if (!visible) return;
+
QPen pen(Qt::black, 3);
if(selected)
pen.setColor(Qt::red);
writer.writeAttribute("id",QString::number(inter->getId()));
writer.writeAttribute("name",inter->getName());
- writer.writeAttribute("ref_name",inter->refInter->getName());
+ writer.writeAttribute("ref_name",inter->getReferenceName());
writer.writeAttribute("orientation",inter->getStrOrientation());
writer.writeAttribute("position",QString::number(inter->getPositionRatio()));
// testers
inline bool isSelected() { return selected; }
+ inline bool isVisible() { return visible; }
// others
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget = 0);
ref2->connectTo(ref1);
ok2 = true;
}
- if ((ok1 == true) || (ok2 == true)) {
-
- cout << "trying to create a connection from " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName());
- cout << " to " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName());
+ if ((ok1 == true) || (ok2 == true)) {
if (ok1) {
+ cout << "trying to create a connection from " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName());
+ cout << " to " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName());
iface1->getOwner()->getScene()->createConnectionItem(iface1,iface2, visible);
}
else {
+ cout << "trying to create a connection from " << qPrintable(ref2->getOwner()->getName()) << "/" << qPrintable(ref2->getName());
+ cout << " to " << qPrintable(ref1->getOwner()->getName()) << "/" << qPrintable(ref1->getName());
iface2->getOwner()->getScene()->createConnectionItem(iface2,iface1, visible);
}
make.copy(dest);
}
- // copying external resources
+ // generate VHDL + copying external resources
QString dest = params->projectPath;
- dest += "/src/";
- try {
+ dest += "/src/";
+ try {
params->getGraph()->generateVHDL(dest);
QList<QString> extResources = params->getGraph()->getExternalResources();
catch(Exception e) {
throw(e);
}
+ // generate testbench
+ dest = params->projectPath;
+ dest += "/testbench/";
+ dest += params->projectName;
+ dest += "_tb.vhd";
+ try {
+ params->getGraph()->generateTestbench(params->projectName, dest);
+ }
+ catch(Exception e) {
+ throw(e);
+ }
// creating parameters file
QString paramName = params->projectPath+"/params-isim.txt";
}
out << endl;
out << "VL_SRC := ${XILINX}/verilog/src/glbl.v" << endl << endl;
- out << "TB_SRC := $(TB_DIR)/read_csv.vhd \\" << endl;
- out << "\t$(TB_DIR)/$(PROJECT_NAME)_tb.vhd" << endl << endl;
+ out << "TB_SRC := $(TB_DIR)/$(PROJECT_NAME)_tb.vhd" << endl << endl;
out << "SIMU_EXE := $(PROJECT_NAME)_tb" << endl << endl;
paramFile.close();
cout << "call to " << qPrintable(fctName) << endl;
#endif
- bool createIfaces = true;
- if (context == Load) {
- createIfaces = false;
- }
+ Graph* graph = NULL;
// creating the graph and thus, the topgroup
- Graph* graph = params->initGraph(createIfaces);
- graph->addClock(mainClock);
+ if (context == Design) {
+ graph = params->initGraph(true);
+ graph->addClock(mainClock);
+ }
+ else if (context == Load) {
+ graph = params->initGraph(false);
+ }
+
// get the top group
GroupBlock *topBlock = graph->getTopGroup();
// creating the top group widget
cout << "call to " << qPrintable(fctName) << endl;\r
#endif\r
\r
+ cout << "creating input pattern" << endl;\r
lengthIP = -1;\r
foreach(AbstractInterface* iface, getControlInputs()) {\r
\r
FunctionalBlock* Graph::createFunctionalBlock(GroupBlock* group, ReferenceBlock* ref, bool createIfaces) {
FunctionalBlock* newBlock = NULL;
- if (ref->getSpecialType() != -1) {
+ if (ref->getSpecialType() != SpecialBlock::NotSpecial) {
cout << "Graph: create special block from " << qPrintable(ref->getName()) << endl;
newBlock = new SpecialBlock(this, ref->getSpecialType(), group,ref, createIfaces);
}
}
void Graph::generateVHDL(const QString &path) throw(Exception) {
+ // generating VHDL for stimulis
+ cout << "generating stimulis" << endl;
+ try {
+ foreach(FunctionalBlock* stimuli, stimulis) {
+ stimuli->generateVHDL(path);
+ }
+ }
+ catch(Exception e) {
+ throw(e);
+ }
+ // generating VHDL for top group
+ cout << "generating top group" << endl;
try {
topGroup->generateVHDL(path);
}
}
}
+void Graph::generateTestbench(const QString &projectName, const QString &benchFile) throw(Exception) {
+
+
+ QFile vhdlBench(benchFile);
+
+ if (!vhdlBench.open(QIODevice::WriteOnly)) {
+ throw(Exception(VHDLFILE_NOACCESS));
+ }
+
+ cout << "generate testbench" << endl;
+ QTextStream out(&vhdlBench);
+
+ out << "-------------------------------------------------------------------------------" << endl;
+ out << "-- testbench for " << projectName << endl;
+ out << "-------------------------------------------------------------------------------" << endl << endl;
+ out << "-------------------------------------------------------------------------------" << endl;
+ out << "-- clock generator" << endl;
+ out << "-------------------------------------------------------------------------------" << endl << endl;
+
+ out << "library IEEE;" << endl;
+ out << "use IEEE.STD_LOGIC_1164.all;" << endl;
+ out << "use IEEE.numeric_std.all;" << endl;
+ out << "entity clock_gen is" << endl;
+ out << " generic (" << endl;
+ out << " Tps : time -- high level width : must be < period" << endl;
+ out << " );" << endl;
+ out << " port (" << endl;
+ out << " phase : out std_logic" << endl;
+ out << " );" << endl;
+ out << "end entity clock_gen;" << endl<< endl;
+
+ out << "architecture clock_gen_1 of clock_gen is" << endl;
+ out << " constant period : time := 2*Tps;" << endl;
+ out << "begin" << endl;
+ out << " clock_process : process" << endl;
+ out << " begin" << endl;
+ out << " phase <= '1', '0' after Tps;" << endl;
+ out << " wait for period;" << endl;
+ out << " end process clock_process;" << endl;
+ out << "end architecture clock_gen_1;" << endl << endl;
+
+ out << "-------------------------------------------------------------------------------" << endl;
+ out << "-- testbench" << endl;
+ out << "-------------------------------------------------------------------------------" << endl << endl;
+ out << "library IEEE;" << endl;
+ out << "use IEEE.STD_LOGIC_1164.all;" << endl;
+ out << "use IEEE.numeric_std.all;" << endl;
+ out << "entity " << projectName << "_tb is" << endl;
+ out << "end entity " << projectName << "_tb;" << endl << endl;
+ out << "architecture " << projectName << "_tb_1 of " << projectName << "_tb is" << endl << endl;
+
+ out << " component clock_gen" << endl;
+ out << " generic (" << endl;
+ out << " Tps : time" << endl;
+ out << " );" << endl;
+ out << " port (" << endl;
+ out << " phase : out std_logic" << endl;
+ out << " );" << endl;
+ out << " end component;" << endl << endl;
+
+ topGroup->generateComponent(out,false);
+
+ vhdlBench.close();
+
+}
+
QList<QString> Graph::getExternalResources() {
QList<QString> list = topGroup->getExternalResources();
return list;
void computeOutputPatterns(int nbExec) throw(Exception);
void generateVHDL(const QString& path) throw(Exception);
+ void generateTestbench(const QString& projectName, const QString& benchFile) throw(Exception);
private:
GroupBlock* topGroup;
while (!fifo.isEmpty()) {
AbstractBlock* block = fifo.takeFirst();
- if (block->getOutputPatternComputed()) continue; // block has already been processed
-
- cout << "computing compat and output for " << qPrintable(block->getName()) << endl;
-
+ if (block->getOutputPatternComputed()) continue; // block has already been processed
try {
+ cout << "computing compatibility of " << qPrintable(block->getName()) << endl;
block->checkInputPatternCompatibility();
}
catch(Exception e) {
}
try {
+ cout << "computing output of " << qPrintable(block->getName()) << endl;
block->computeOutputPattern();
}
catch(Exception e) {
ConnectedInterface* conn = (ConnectedInterface*)iface;
foreach(ConnectedInterface* connTo, conn->getConnectedTo()) {
- AbstractBlock* block1 = connTo->getOwner();
- cout << "testing if " << qPrintable(block1->getName()) << " has all connected inputs connected to already processed blocks" << endl;
- bool addIt = true;
- int maxLevel = 0;
-
- foreach(AbstractInterface* iface, block1->getControlInputs()) {
- //cout << qPrintable(iface->getName()) << " of " << qPrintable(iface->getOwner()->getName()) << " connected to " << endl;
- ConnectedInterface* connFrom = ((ConnectedInterface*)iface)->getConnectedFrom();
- //cout << qPrintable(connFrom->getName()) << " of " << qPrintable(connFrom->getOwner()->getName()) << endl;
-
- if ((connFrom != NULL) && (connFrom->getOwner()->getOutputPatternComputed() == false)) {
- addIt = false;
- break;
- }
- else {
- if (connFrom->getOwner()->getTraversalLevel() > maxLevel) maxLevel = connFrom->getOwner()->getTraversalLevel();
+ AbstractBlock* blockTo = connTo->getOwner();
+ // do sthg only if blockTo is not this group block
+ if (blockTo != this) {
+ cout << "testing if " << qPrintable(blockTo->getName()) << " has all connected inputs connected to already processed blocks" << endl;
+ bool addIt = true;
+ int maxLevel = 0;
+
+ foreach(AbstractInterface* iface, blockTo->getControlInputs()) {
+ cout << qPrintable(iface->getName()) << "/" << qPrintable(iface->getOwner()->getName()) << " connected from ";
+ ConnectedInterface* connFrom = ((ConnectedInterface*)iface)->getConnectedFrom();
+ cout << qPrintable(connFrom->getName()) << "/" << qPrintable(connFrom->getOwner()->getName()) << endl;
+
+ if ((connFrom != NULL) && (connFrom->getOwner()->getOutputPatternComputed() == false)) {
+ addIt = false;
+ break;
+ }
+ else {
+ if (connFrom->getOwner()->getTraversalLevel() > maxLevel) maxLevel = connFrom->getOwner()->getTraversalLevel();
+ }
}
- }
- if (addIt) {
- cout << "adding " << qPrintable(block1->getName()) << " to the FIFO" << endl;
- block1->setTraversalLevel(maxLevel+1); // level 0 = first blocks to be evaluated
- fifo.append(block1);
+ if (addIt) {
+ cout << "adding " << qPrintable(blockTo->getName()) << " to the FIFO" << endl;
+ blockTo->setTraversalLevel(maxLevel+1); // level 0 = first blocks to be evaluated
+ fifo.append(blockTo);
+ }
}
}
}
}
void GroupItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) {
+
+ if (!visible) return;
+
if(boxWidth > 0 && boxHeight > 0){
if(selected)
painter->setPen(Qt::red);
clkList += QString::number(d)+",";
}
clkList.chop(1);
- writer.writeAttribute("clkList",clkList);
+ writer.writeAttribute("clklist",clkList);
}
groupItem->save(writer);
#include "GroupInterface.h"
#include "FunctionalInterface.h"
#include "BoxItem.h"
+#include "ReferenceInterface.h"
int InterfaceItem::counter = 0;
return refInter->getName();
}
+QString InterfaceItem::getReferenceName() {
+ if (!refInter->isFunctionalInterface()) {
+ return "no_refname_for_groupiface";
+ }
+ FunctionalInterface* iface = AI_TO_FUN(refInter);
+ ReferenceInterface* refIface = iface->getReference();
+ return refIface->getName();
+}
+
void InterfaceItem::updateName(QString name) {
QFontMetrics fmName(params->defaultIfaceFont);
nameWidth = fmName.width(refInter->getName());
// getters
inline int getId() { return id; }
QString getName();
+ QString getReferenceName();
inline double getPositionRatio() { return positionRatio; }
inline double getPosition() { return position; }
inline int getOrientation() { return orientation; }
--- /dev/null
+OPT := params-isim.txt
+
+include $(OPT)
+
+ISIM_DIR := isim
+
+ISIM_LIB := work
+
+all : project compile
+
+project : $(PROJECT_NAME).prj
+
+compile : $(PROJECT_NAME).prj $(VHDL_SRC)
+ tb_name=$$( echo $(TB_SRC) | sed 's,.*/,,' | sed 's,[.].*,,'); \
+ fuse $(ISIM_LIB).$$tb_name $(ISIM_LIB).glbl -prj $(PROJECT_NAME).prj -L unisim -L secureip -timeprecision_vhdl ps -o $(SIMU_EXE)
+
+view :
+ $(SIMU_EXE) -gui -wdb $(SIMU_EXE).wdb
+
+$(PROJECT_NAME).prj :
+ if [ -f $@ ]; then rm $@; fi
+ echo "### VHDL sources"
+ for fich in $(VHDL_SRC); do echo vhdl $(ISIM_LIB) $$fich >> $@; done
+ echo "### verilog sources"
+ for fich in $(VL_SRC); do echo verilog $(ISIM_LIB) $$fich >> $@; done
+ echo "### test bench sources"
+ for fich in $(TB_SRC); do echo vhdl $(ISIM_LIB) $$fich >> $@; done
+
+clean :
+ rm -f *~
+ rm -f $(PROJECT_NAME).prj
+ cd $(SRC_DIR); rm -f *~
+ cd $(TB_DIR); rm -f *~
}\r
cout << "project path set to " << qPrintable(projectPath) << endl;\r
}\r
+\r
+ /**********************************************************\r
+ 0 : getting parameters\r
+ ***********************************************************/\r
+ int width = 0;\r
+ int height = 0;\r
+ int lineLength = 0;\r
+ int gapLength = 0;\r
+ QString fontName="";\r
+ int fontSize;\r
+ QString autoConn="";\r
+ QDomNode paramsNode = root.elementsByTagName("parameters").at(0);\r
+\r
+ QDomElement blocksElt = paramsNode.firstChildElement("block_view");\r
+ width = blocksElt.attribute("width","none").toInt(&ok);\r
+ if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+ height = blocksElt.attribute("height","none").toInt(&ok);\r
+ if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+ fontName = blocksElt.attribute("font","none");\r
+ if(fontName == "none") throw(Exception(PROJECTFILE_CORRUPTED));\r
+ fontSize = blocksElt.attribute("font_size","none").toInt(&ok);\r
+ if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+ defaultBlockWidth = width;\r
+ defaultBlockHeight = height;\r
+ defaultBlockFontName = fontName;\r
+ defaultBlockFontSize = fontSize;\r
+ defaultBlockFont = QFont(defaultBlockFontName, defaultBlockFontSize);\r
+\r
+ QDomElement ifacesElt = paramsNode.firstChildElement("interface_view");\r
+ lineLength = ifacesElt.attribute("line_length","none").toInt(&ok);\r
+ if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+ width = ifacesElt.attribute("width","none").toInt(&ok);\r
+ if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+ height = ifacesElt.attribute("height","none").toInt(&ok);\r
+ if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+ fontName = ifacesElt.attribute("font","none");\r
+ if(fontName == "none") throw(Exception(PROJECTFILE_CORRUPTED));\r
+ fontSize = ifacesElt.attribute("font_size","none").toInt(&ok);\r
+ if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+ arrowLineLength = lineLength;\r
+ arrowWidth = width;\r
+ arrowHeight = height;\r
+ defaultIfaceFontName = fontName;\r
+ defaultIfaceFontSize = fontSize;\r
+ defaultIfaceFont = QFont(defaultIfaceFontName, defaultIfaceFontSize);\r
+\r
+ QDomElement connsElt = paramsNode.firstChildElement("connection_view");\r
+ gapLength = connsElt.attribute("gap_length","none").toInt(&ok);\r
+ if(!ok) throw(Exception(PROJECTFILE_CORRUPTED));\r
+ autoConn = connsElt.attribute("auto_conn","none");\r
+ if (autoConn == "false") {\r
+ autoConnMainClk = false;\r
+ }\r
+ else {\r
+ autoConnMainClk = true;\r
+ }\r
+ connGapLength = gapLength;\r
+\r
/**********************************************************\r
1 : getting scene and creating associated group widgets\r
***********************************************************/\r
attributeStr = eltInterfaces.attribute("height", "none");\r
arrowHeight = attributeStr.toInt(&ok);\r
if (!ok || arrowHeight < 1) throw(Exception(CONFIGFILE_CORRUPTED));\r
- attributeStr = eltInterfaces.attribute("linelength", "none");\r
+ attributeStr = eltInterfaces.attribute("line_length", "none");\r
arrowLineLength = attributeStr.toInt(&ok);\r
if (!ok || arrowLineLength < 1) throw(Exception(CONFIGFILE_CORRUPTED));\r
attributeStr = eltInterfaces.attribute("font_size", "none");\r
defaultIfaceFont = QFont(defaultIfaceFontName, defaultIfaceFontSize);\r
\r
QDomElement eltConnections = eltInterfaces.nextSiblingElement("connections");\r
- attributeStr = eltConnections.attribute("gaplength", "none");\r
+ attributeStr = eltConnections.attribute("gap_length", "none");\r
connGapLength = attributeStr.toInt(&ok);\r
if (!ok || connGapLength < 1) throw(Exception(CONFIGFILE_CORRUPTED));\r
}\r
writer.writeStartDocument();\r
\r
writer.writeStartElement("blast_project");\r
+\r
+ writer.writeStartElement("parameters");\r
+ writer.writeStartElement("block_view");\r
+ writer.writeAttribute("width",QString::number(defaultBlockWidth));\r
+ writer.writeAttribute("height",QString::number(defaultBlockHeight));\r
+ writer.writeAttribute("font",defaultBlockFontName);\r
+ writer.writeAttribute("font_size",QString::number(defaultBlockFontSize));\r
+ writer.writeEndElement(); //</blocks>\r
+ writer.writeStartElement("interface_view");\r
+ writer.writeAttribute("line_length",QString::number(arrowLineLength));\r
+ writer.writeAttribute("width",QString::number(arrowWidth));\r
+ writer.writeAttribute("height",QString::number(arrowHeight));\r
+ writer.writeAttribute("font",defaultIfaceFontName);\r
+ writer.writeAttribute("font_size",QString::number(defaultIfaceFontSize));\r
+ writer.writeEndElement(); //</interfaces>\r
+ writer.writeStartElement("connection_view");\r
+ writer.writeAttribute("gap_length",QString::number(connGapLength));\r
+ if (autoConnMainClk) {\r
+ writer.writeAttribute("auto_conn","true");\r
+ }\r
+ else {\r
+ writer.writeAttribute("auto_conn","false");\r
+ }\r
+ writer.writeEndElement(); //</connections>\r
+\r
+ writer.writeEndElement(); //</parameters>\r
+\r
writer.writeStartElement("scenes");\r
\r
writer.writeAttribute("count",QString::number(dispatcher->getNumberOfScenes()));\r
connIface->setOutputPattern(pat);\r
outputPattern.insert(connIface,pat);\r
}\r
+ setOutputPatternComputed(true);\r
cout << "output pattern computed" << endl;\r
}\r
\r
writer.writeAttribute("id",QString::number(inter->getId()));
writer.writeAttribute("name",inter->getName());
- writer.writeAttribute("ref_name",inter->refInter->getName());
+ writer.writeAttribute("ref_name",inter->getReferenceName());
writer.writeAttribute("orientation",inter->getStrOrientation());
writer.writeAttribute("position",QString::number(inter->getPositionRatio()));
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE QtCreatorProject>
-<!-- Written by QtCreator 4.2.0, 2018-05-07T18:17:25. -->
+<!-- Written by QtCreator 4.2.0, 2018-05-09T18:21:40. -->
<qtcreator>
<data>
<variable>EnvironmentId</variable>
<defaults>
<blocks width="175" height="125" font="Helvetica" font_size="14" />
- <interfaces linelength="10" width="5" height="10" font="Helvetica" font_size="10" />
- <connections gaplength="20" />
+ <interfaces line_length="10" width="5" height="10" font="Helvetica" font_size="10" />
+ <connections gap_length="20" />
</defaults>
</config>
</xs:attributeGroup>
<xs:attributeGroup name="interfacesAttrGroup">
- <xs:attribute ref="linelength" use="required" />
+ <xs:attribute ref="line_length" use="required" />
<xs:attribute ref="width" use="required" />
<xs:attribute ref="height" use="required" />
<xs:attribute ref="font" use="required" />
</xs:simpleType>
</xs:attribute>
- <xs:attribute name="linelength">
+ <xs:attribute name="line_length">
<xs:simpleType>
<xs:restriction base="xs:nonNegativeInteger">
<xs:minInclusive value="1"/>
</xs:simpleType>
</xs:attribute>
- <xs:attribute name="gaplength">
+ <xs:attribute name="gap_length">
<xs:simpleType>
<xs:restriction base="xs:nonNegativeInteger">
<xs:minInclusive value="1"/>
<xs:element name="connections">
<xs:complexType>
- <xs:attribute ref="gaplength" use="required"/>
+ <xs:attribute ref="gap_length" use="required"/>
</xs:complexType>
</xs:element>
<xs:attribute name="context" type="xs:string"/>
<xs:attribute name="type" type="xs:string"/>
<xs:attribute name="params" type="xs:string"/>
- <xs:attribute name="project_path" type="xs:string"/>
+ <xs:attribute name="project_path" type="xs:string"/>
+
+ <xs:attribute name="font" type="xs:string"/>
+ <xs:attribute name="font_size" type="xs:nonNegativeInteger"/>
+ <xs:attribute name="width" type="xs:nonNegativeInteger"/>
+ <xs:attribute name="height" type="xs:nonNegativeInteger"/>
+ <xs:attribute name="line_length" type="xs:nonNegativeInteger"/>
+ <xs:attribute name="gap_length" type="xs:nonNegativeInteger"/>
+ <xs:attribute name="auto_conn">
+ <xs:simpleType>
+ <xs:restriction base="xs:string">
+ <xs:enumeration value="true"/>
+ <xs:enumeration value="false"/>
+ </xs:restriction>
+ </xs:simpleType>
+ </xs:attribute>
<!-- déclaration des groupes d'éléments -->
<xs:group name="rootElmtGroup">
<xs:sequence>
+ <xs:element ref="parameters"/>
<xs:element ref="scenes"/>
<xs:element ref="connections"/>
<xs:element ref="modifiers"/>
<!-- déclaration des éléments -->
+ <xs:element name="parameters">
+ <xs:complexType>
+ <xs:sequence>
+ <xs:element ref="block_view" />
+ <xs:element ref="interface_view" />
+ <xs:element ref="connection_view" />
+ </xs:sequence>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="block_view">
+ <xs:complexType>
+ <xs:attribute ref="width"/>
+ <xs:attribute ref="height"/>
+ <xs:attribute ref="font"/>
+ <xs:attribute ref="font_size"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="interface_view">
+ <xs:complexType>
+ <xs:attribute ref="line_length"/>
+ <xs:attribute ref="width"/>
+ <xs:attribute ref="height"/>
+ <xs:attribute ref="font"/>
+ <xs:attribute ref="font_size"/>
+ </xs:complexType>
+ </xs:element>
+
+ <xs:element name="connection_view">
+ <xs:complexType>
+ <xs:attribute ref="gap_length"/>
+ <xs:attribute ref="auto_conn"/>
+ </xs:complexType>
+ </xs:element>
<xs:element name="scenes">
<xs:complexType>