Presentation
The Design Technology Rules (DTR) format was developped as a part of the Chams Project (http://www-soc.lip6.fr/recherche/cian/chams/). It aims at offering a generic description of layout design rules for CMOS technologies.
Author
Damien Dupuis: damien.dupuis(at)lip6(.)fr
Limitations
Only simple rules are supported at the moment. For example the minimum width of a metal layer has only one value, although it should depends on the length of the wire drawned.
Stand alone database structure
The database contains four object :
- DTR::Techno contains generic informations such as the name of the technology and the unit used, and the list of all technologic rules.
- DTR::Rule & DTR::ARule respectively describe a symmetrical and an asymmetrical rule.
The library also use the DTR::DTRException class to throw excptions.
Using the parser
Simply load a technology with static function DTR::Techno::readFromFile() and then get rules (DTR::Techno::getRule()) or directly values (DTR::Techno::getValue()).
Using the driver
Using the driver is very simple, user has to create a DTR::Techno object and simply add DTR::Rule or DTR::ARule to it. The adding methods return the newly created Rule so user can set the rule type (DTR::Rule::setType()) if necessary. Finally use the DTR::Techno::writeToFile() method to dump the database to file.
Examples
As said is the global presentation, VLSI SAPD project provides C++ libraries and Python modules for each supported format. In this section we present simple code examples to parse and drive a DTR file using C++ or Python. The DTR file considered is the same for all examples: example.dtr.xml
<technology name="example" unit="micro" version="rev.A">
<physical_rules>
<rule name="transistorMinL" value="0.10" ref="ref1"/>
<rule name="transistorMinW" value="0.20" ref="ref2"/>
<rule name="minWidth" layer="metal1" value="0.15" ref="ref3"/>
<rule name="minSpacing" layer="metal1" value="0.20" ref="ref4"/>
<rule name="minSpacing" layer1="active" layer2="poly" value="0.10" ref="ref5"/>
<arule name="minExtension" layer1="poly" layer2="active" value="0.20" ref="ref6"/>
<rule name="minArea" type="area" layer="metal1" value="0.100" ref="ref7"/>
</physical_rules>
</technology>
All source codes are available in the examples
directory.
C++
Parser
The following code (parseDtr.cpp
) is an example of how to parse a DTR file using C++ library.
#include <iostream>
#include <string>
#include "vlsisapd/dtr/Techno.h"
int main(int argc, char * argv[]) {
cerr << "+-----------------------------+" << endl
<<
"| technology: " << techno->
getName() <<
" |" << endl
<<
"| units: " << techno->
getUnit() <<
" |" << endl
<< "| version: " << techno->getVersion() << " |" << endl
<< "+-----------------------------+" << endl << endl;
cerr <<
"transistorMinL = " << techno->
getValue(
"transistorMinL") << endl
<<
"minWidth of metal1 = " << techno->
getValue(
"minWidth",
"metal1") << endl
<<
"minSpacing of metal1 = " << techno->
getValue(
"minWidth",
"metal1") << endl
<<
"minSpacing of active vs poly = " << techno->
getValue(
"minSpacing",
"active",
"poly") << endl
<<
"minExtension active over poly = " << techno->
getValue(
"minExtension",
"poly",
"active") << endl
<<
"minArea of metal1 = " << techno->
getValue(
"minArea",
"metal1") << endl;
return 0;
}
Driver
This C++ code (driveDtr.cpp
) generates a out.dtr.xml file equivalent to the previous example.dtr.xml.
#include <string>
#include "vlsisapd/dtr/Techno.h"
#include "vlsisapd/dtr/Rules.h"
int main(int argc, char * argv[]) {
techno->
addRule (
"transistorMinL", 0.1 ,
"ref1");
techno->
addRule (
"transistorMinW", 0.2 ,
"ref2");
techno->
addRule (
"minWidth" , 0.15,
"ref3",
"metal1");
techno->
addRule (
"minSpacing" , 0.2 ,
"ref4",
"metal1");
techno->
addRule (
"minSpacing" , 0.1 ,
"ref5",
"active",
"poly");
techno->
addARule(
"minExtension" , 0.2 ,
"ref6",
"poly" ,
"active");
return 0;
}
- Note
- In order to compile these codes, a CMakeLists.txt file is provided. User must set the $VLSISAPD_TOP variable before running these commands in the directory containing the CMakeLists.txt file:
%> mkdir build; cd build
%> cmake ..
%> make
Python
Parser
The following python script (parseDtr.py
) is an example of how to parse a DTR file using python module.
from DTR import *
from decimal import Decimal
techno = Techno.readFromFile("./example.dtr.xml")
print "+-----------------------------+"
print "| technology: "+techno.get) + " |"
print "| units: "+techno.getUnit() +" |"
print "| version: "+techno.getVersion()+" |"
print "+-----------------------------+\n\n"
print "transistorMinL = %s"%techno.getValue("transistorMinL")
print "transistorMinW = %s"%Decimal(techno.getValueAsString("transistorMinW"))
print "minWidth of metal1 = %s"%techno.getValue("minWidth", "metal1")
print "minSpacing of metal1 = %s"%techno.getValue("minWidth", "metal1")
print "minSpacing of active vs poly = %s"%techno.getValue("minSpacing", "active", "poly")
print "minExtension active over poly = %s"%techno.getValue("minExtension", "poly", "active")
print "minArea of metal1 = %s"%techno.getValue("minArea", "metal1")
print techno.getValue("minArea", "metal1")*3-0.3
print Decimal(techno.getValueAsString("minArea", "metal1"))*3-Decimal('0.3')
Driver
This python script (driveDtr.py
) generates a out.dtr.xml file equivalent to the previous example.dtr.xml.
from DTR import *
techno = Techno("myTech", "micro", "rev.A")
techno.addRule ("transistorMinL", 0.1 , "ref1")
techno.addRule ("transistorMinW", 0.2 , "ref2")
techno.addRule ("minWidth" , 0.15, "ref3", "metal1")
techno.addRule ("minSpacing" , 0.2 , "ref4", "metal1")
techno.addRule ("minSpacing" , 0.1 , "ref5", "active", "poly")
techno.addARule("minExtension" , 0.2 , "ref6", "poly", "active")
rule = techno.addRule("minArea", 0.1, "ref7", "metal1")
rule.setType("area")
techno.writeToFile("./out.dtr.xml")
- Note
- In order to run these two scripts (
parseDtr.py
& driveDtr.py), user must ensure that $PYTHONPATH variable points to the directory containing DTR.so module.