-bugs, prise en compte des cellules multi-sorties, +doc ...

This commit is contained in:
Christophe Alexandre 2002-12-09 15:03:28 +00:00
parent 044e091c5f
commit 710ad11452
7 changed files with 78 additions and 18 deletions

View File

@ -11,7 +11,7 @@ AC_SUBST(A2SDF_VERSION)
# For automake. # For automake.
VERSION=$A2SDF_VERSION VERSION=$A2SDF_VERSION
PACKAGE=emmaus PACKAGE=a2sdf
dnl Initialize automake stuff dnl Initialize automake stuff
AM_INIT_AUTOMAKE($PACKAGE, $VERSION) AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
@ -32,4 +32,5 @@ AM_ALLIANCE
AC_OUTPUT([ AC_OUTPUT([
Makefile Makefile
src/Makefile src/Makefile
doc/Makefile
]) ])

View File

@ -0,0 +1,4 @@
## Process this file with automake to produce Makefile.in
man_MANS = a2sdf.1
EXTRA_DIST = $(man_MANS)

View File

@ -0,0 +1,39 @@
.pl -.4
.TH A2SDF 1 "December 09, 2002" "ASIM/LIP6" "CAO\-VLSI Reference Manual"
.SH NAME
.TP
a2sdf
- alliance to sdf format converter
.so man1/alc_origin.1
.SH SYNOPSIS
.TP
\fBa2sdf\fP
[\fBoptions\fP] \fIcells_dir\fP \fIoutputname\fP
.br
.SH DESCRIPTION
\fBa2sdf\fP translates the SXLIB library to the SDF format. Please refer to
http://www.eda.org/sdf/ for more information on SDF format.
.br
Only the SXLIB library has got timing informations at the moment, so it's
the only library we are able to convert.
.br
\fBcells directory\fP
.br
The path to the SXLIB cells directory.
.br
\fBoutput name\fP
.br
Just the name of the file containing the timing information in sdf format.
It should be named with a .sdf extension.
.br
.SH OPTIONS
.PP
\fB-v[ersion]\fP displays the tool's version.
.br
\fB-h[elp]\fP displays a small help message.
.br
\fB-V[erbose]\fP sets the verbose mode on.
.br
.so man1/alc_bug_report.1

View File

@ -42,6 +42,12 @@ A2Sdf::CreateTimingCell(const char* name)
befig_list* befig = vhdlloadbefig(NULL,const_cast<char*>(name),0/*don't dump message*/); befig_list* befig = vhdlloadbefig(NULL,const_cast<char*>(name),0/*don't dump message*/);
assert(befig); assert(befig);
if (_verbose)
{
cout << " o Treating cell: " << name << endl;
}
list<const char*> outs; list<const char*> outs;
for (const bepor_list* bepor=befig->BEPOR; bepor; bepor=bepor->NEXT) for (const bepor_list* bepor=befig->BEPOR; bepor; bepor=bepor->NEXT)
{ {
@ -52,12 +58,6 @@ A2Sdf::CreateTimingCell(const char* name)
} }
} }
if (outs.size() > 1)
{
cerr << name << endl;
return;
}
for (list<const char*>::const_iterator lit = outs.begin(); for (list<const char*>::const_iterator lit = outs.begin();
lit != outs.end(); lit != outs.end();
lit++) lit++)

View File

@ -10,11 +10,14 @@ class A2Sdf
public: public:
typedef list<TimingCell*> TimingCells; typedef list<TimingCell*> TimingCells;
private: private:
bool _verbose;
const char* _fileName; const char* _fileName;
TimingCells _timingCells; TimingCells _timingCells;
public: public:
A2Sdf(const char* filename): A2Sdf(const char* filename, bool verbose)
_fileName(filename), _timingCells() : _verbose(verbose)
, _fileName(filename)
, _timingCells()
{} {}
~A2Sdf(); ~A2Sdf();

View File

@ -12,10 +12,10 @@ IOPath*
TimingCell::AddIOPath(const char* input, const char* output) TimingCell::AddIOPath(const char* input, const char* output)
{ {
IOPathKey key(input, output); IOPathKey key(input, output);
IOPath* ioPath = _ioPaths[key]; IOPaths::iterator ioPathIt;
if (ioPath) if ((ioPathIt = _ioPaths.find(key)) != _ioPaths.end())
return ioPath; return ioPathIt->second;
ioPath = new IOPath(input, output); IOPath* ioPath = new IOPath(input, output);
_ioPaths[key] = ioPath; _ioPaths[key] = ioPath;
return ioPath; return ioPath;
} }

View File

@ -10,7 +10,7 @@ using namespace std;
static void version(void) static void version(void)
{ {
cout << "a2sdf(" PACKAGE ") " VERSION << endl; cout << "a2sdf(" PACKAGE ") " VERSION << endl;
cout << "The " PACKAGE " package comes with NO WARRANTY" << endl; cout << "ALLIANCE " << ALLIANCE_VERSION << endl;
} }
int int
@ -18,20 +18,22 @@ main(int argc, char** argv)
{ {
int showUsage = 0; int showUsage = 0;
int showVersion = 0; int showVersion = 0;
int verbose = 0;
const char* cellsDir = NULL; const char* cellsDir = NULL;
const char* sdfFileName = NULL; const char* sdfFileName = NULL;
poptOption options[] = { poptOption options[] = {
{ "help", 'h', POPT_ARG_NONE, &showUsage, 0, "print this message", 0}, { "help", 'h', POPT_ARG_NONE, &showUsage, 0, "print this message", 0},
{ "version", 'v', POPT_ARG_NONE, &showVersion, 0, "print the version information", 0}, { "version", 'v', POPT_ARG_NONE, &showVersion, 0, "print the version information", 0},
{ "Verbose", 'V', POPT_ARG_NONE, &verbose, 0, "verbose mode", 0},
{ 0, 0, 0, 0, 0, 0, 0 } { 0, 0, 0, 0, 0, 0, 0 }
}; };
poptContext context = poptGetContext("a2sdf", argc, (const char**)argv, options, 0); poptContext context = poptGetContext("a2sdf", argc, (const char**)argv, options, 0);
poptSetOtherOptionHelp(context, "<cellsdir> <sdffilename> "); poptSetOtherOptionHelp(context, " -hvV <cellsdir> <sdffilename> ");
if (int rc = poptGetNextOpt(context) < -1) if (int rc = poptGetNextOpt(context) < -1)
{ {
cerr << "simann: bad argument " << poptBadOption(context, POPT_BADOPTION_NOALIAS) << ": " << poptStrerror(rc) << endl; cerr << "a2sdf: bad argument " << poptBadOption(context, POPT_BADOPTION_NOALIAS) << ": " << poptStrerror(rc) << endl;
cerr << "Try `" << argv[0] << " --help' for more information" << endl; cerr << "Try `" << argv[0] << " --help' for more information" << endl;
return 1; return 1;
} }
@ -74,12 +76,14 @@ main(int argc, char** argv)
return 1; return 1;
} }
A2Sdf a2sdf(sdfFileName); A2Sdf a2sdf(sdfFileName, verbose);
int extensionlength = strlen(EXTENSION); int extensionlength = strlen(EXTENSION);
struct dirent* entry = NULL; struct dirent* entry = NULL;
bool cellFound = false;
while ((entry = readdir (dir)) != NULL) while ((entry = readdir (dir)) != NULL)
{ {
char* filename = entry->d_name; char* filename = entry->d_name;
@ -89,12 +93,21 @@ main(int argc, char** argv)
/* is extension of filename accepted */ /* is extension of filename accepted */
if (strncmp (filename + filenamelength - extensionlength, if (strncmp (filename + filenamelength - extensionlength,
EXTENSION, extensionlength)) continue; EXTENSION, extensionlength)) continue;
cellFound = true;
string cellName(filename); string cellName(filename);
cellName.erase( cellName.find(EXTENSION)); cellName.erase( cellName.find(EXTENSION));
a2sdf.CreateTimingCell(cellName.c_str()); a2sdf.CreateTimingCell(cellName.c_str());
} }
a2sdf.Dump(); if (cellFound)
a2sdf.Dump();
else
{
cerr << " o Error: No cell to convert in: "
<< cellsDir << endl;
return 1;
}
return 0; return 0;
} }