52static void Abc_SclReadSurfaceGenlib(
SC_Surface *
p )
58 Vec_FltPush( &
p->vIndex0, 0 );
59 Vec_IntPush( &
p->vIndex0I, Scl_Flt2Int(0) );
61 Vec_FltPush( &
p->vIndex1, 0 );
62 Vec_IntPush( &
p->vIndex1I, Scl_Flt2Int(0) );
64 for ( i = 0; i < Vec_FltSize(&
p->vIndex0); i++ )
66 vVec = Vec_FltAlloc( Vec_FltSize(&
p->vIndex1) );
67 Vec_PtrPush( &
p->vData, vVec );
68 vVecI = Vec_IntAlloc( Vec_FltSize(&
p->vIndex1) );
69 Vec_PtrPush( &
p->vDataI, vVecI );
70 for ( j = 0; j < Vec_FltSize(&
p->vIndex1); j++ )
72 Vec_FltPush( vVec, 1 );
73 Vec_IntPush( vVecI, Scl_Flt2Int(1) );
85 p->default_wire_load = 0;
86 p->default_wire_load_sel = 0;
87 p->default_max_out_slew = 0;
90 p->unit_cap_fst = 1.0;
95 SC_Cell * pCell = Abc_SclCellAlloc();
96 pCell->
Id = SC_LibCellNum(
p);
97 Vec_PtrPush( &
p->vCells, pCell );
112 SC_Pin * pPin = Abc_SclPinAlloc();
113 Vec_PtrPush( &pCell->
vPins, pPin );
127 SC_Pin * pPin = Abc_SclPinAlloc();
128 Vec_PtrPush( &pCell->
vPins, pPin );
137 Vec_WrdGrow( &pPin->
vFunc, Abc_Truth6WordNum(pCell->
n_inputs) );
138 for ( k = 0; k < Vec_WrdCap(&pPin->
vFunc); k++ )
139 Vec_WrdPush( &pPin->
vFunc, pTruth[k] );
150 SC_Timing * pTime = Abc_SclTimingAlloc();
151 Vec_PtrPush( &pRTime->
vTimings, pTime );
159 Abc_SclReadSurfaceGenlib( &pTime->
pCellRise );
160 Abc_SclReadSurfaceGenlib( &pTime->
pCellFall );
161 Abc_SclReadSurfaceGenlib( &pTime->
pRiseTrans );
162 Abc_SclReadSurfaceGenlib( &pTime->
pFallTrans );
172 SC_Lib *
p = Abc_SclLibAlloc();
173 if ( !Abc_SclReadLibraryGenlib(
p, pLib ) )
199 for ( i = Vec_StrGetI(vOut, pPos); i != 0; i-- )
201 float Num = Vec_StrGetF(vOut, pPos);
202 Vec_FltPush( &
p->vIndex0, Num );
203 Vec_IntPush( &
p->vIndex0I, Scl_Flt2Int(Num) );
206 for ( i = Vec_StrGetI(vOut, pPos); i != 0; i-- )
208 float Num = Vec_StrGetF(vOut, pPos);
209 Vec_FltPush( &
p->vIndex1, Num );
210 Vec_IntPush( &
p->vIndex1I, Scl_Flt2Int(Num) );
213 for ( i = 0; i < Vec_FltSize(&
p->vIndex0); i++ )
215 vVec = Vec_FltAlloc( Vec_FltSize(&
p->vIndex1) );
216 Vec_PtrPush( &
p->vData, vVec );
217 vVecI = Vec_IntAlloc( Vec_FltSize(&
p->vIndex1) );
218 Vec_PtrPush( &
p->vDataI, vVecI );
219 for ( j = 0; j < Vec_FltSize(&
p->vIndex1); j++ )
221 float Num = Vec_StrGetF(vOut, pPos);
222 Vec_FltPush( vVec, Num );
223 Vec_IntPush( vVecI, Scl_Flt2Int(Num) );
227 for ( i = 0; i < 3; i++ )
228 p->approx[0][i] = Vec_StrGetF( vOut, pPos );
229 for ( i = 0; i < 4; i++ )
230 p->approx[1][i] = Vec_StrGetF( vOut, pPos );
231 for ( i = 0; i < 6; i++ )
232 p->approx[2][i] = Vec_StrGetF( vOut, pPos );
237 int version = Vec_StrGetI( vOut, pPos );
240 Abc_Print( -1,
"Wrong version of the SCL file.\n" );
246 p->pName = Vec_StrGetS(vOut, pPos);
247 p->default_wire_load = Vec_StrGetS(vOut, pPos);
248 p->default_wire_load_sel = Vec_StrGetS(vOut, pPos);
249 p->default_max_out_slew = Vec_StrGetF(vOut, pPos);
251 p->unit_time = Vec_StrGetI(vOut, pPos);
252 p->unit_cap_fst = Vec_StrGetF(vOut, pPos);
253 p->unit_cap_snd = Vec_StrGetI(vOut, pPos);
256 for ( i = Vec_StrGetI(vOut, pPos); i != 0; i-- )
259 Vec_PtrPush( &
p->vWireLoads, pWL );
261 pWL->
pName = Vec_StrGetS(vOut, pPos);
262 pWL->
cap = Vec_StrGetF(vOut, pPos);
263 pWL->
slope = Vec_StrGetF(vOut, pPos);
265 for ( j = Vec_StrGetI(vOut, pPos); j != 0; j-- )
267 Vec_IntPush( &pWL->
vFanout, Vec_StrGetI(vOut, pPos) );
268 Vec_FltPush( &pWL->
vLen, Vec_StrGetF(vOut, pPos) );
273 for ( i = Vec_StrGetI(vOut, pPos); i != 0; i-- )
276 Vec_PtrPush( &
p->vWireLoadSels, pWLS );
278 pWLS->
pName = Vec_StrGetS(vOut, pPos);
279 for ( j = Vec_StrGetI(vOut, pPos); j != 0; j-- )
281 Vec_FltPush( &pWLS->
vAreaFrom, Vec_StrGetF(vOut, pPos) );
282 Vec_FltPush( &pWLS->
vAreaTo, Vec_StrGetF(vOut, pPos) );
287 for ( i = Vec_StrGetI(vOut, pPos); i != 0; i-- )
289 SC_Cell * pCell = Abc_SclCellAlloc();
290 pCell->
Id = SC_LibCellNum(
p);
291 Vec_PtrPush( &
p->vCells, pCell );
293 pCell->
pName = Vec_StrGetS(vOut, pPos);
294 pCell->
area = Vec_StrGetF(vOut, pPos);
295 pCell->
leakage = Vec_StrGetF(vOut, pPos);
298 pCell->
n_inputs = Vec_StrGetI(vOut, pPos);
299 pCell->
n_outputs = Vec_StrGetI(vOut, pPos);
310 for ( j = 0; j < pCell->
n_inputs; j++ )
312 SC_Pin * pPin = Abc_SclPinAlloc();
313 Vec_PtrPush( &pCell->
vPins, pPin );
316 pPin->
pName = Vec_StrGetS(vOut, pPos);
317 pPin->
rise_cap = Vec_StrGetF(vOut, pPos);
318 pPin->
fall_cap = Vec_StrGetF(vOut, pPos);
326 SC_Pin * pPin = Abc_SclPinAlloc();
327 Vec_PtrPush( &pCell->
vPins, pPin );
330 pPin->
pName = Vec_StrGetS(vOut, pPos);
334 k = Vec_StrGetI(vOut, pPos);
341 pPin->
func_text = Vec_StrGetS(vOut, pPos);
347 Vec_WrdGrow( &pPin->
vFunc, Abc_Truth6WordNum(pCell->
n_inputs) );
348 for ( k = 0; k < Vec_WrdCap(&pPin->
vFunc); k++ )
349 Vec_WrdPush( &pPin->
vFunc, Vec_StrGetW(vOut, pPos) );
358 vNames = Vec_PtrAlloc( pCell->
n_inputs );
360 Vec_PtrPush( vNames, pPin2->
pName );
363 Vec_WrdErase( &pPin->
vFunc );
365 pPin->
vFunc = *vFunc;
367 Vec_PtrFree( vNames );
370 for ( k = 0; k < Vec_WrdSize(&pPin->
vFunc); k++ )
372 word Value = Vec_StrGetW(vOut, pPos);
378 for ( k = 0; k < pCell->
n_inputs; k++ )
383 pRTime->
pName = Vec_StrGetS(vOut, pPos);
384 n = Vec_StrGetI(vOut, pPos);
assert( n <= 1 );
387 SC_Timing * pTime = Abc_SclTimingAlloc();
388 Vec_PtrPush( &pRTime->
vTimings, pTime );
391 Abc_SclReadSurface( vOut, pPos, &pTime->
pCellRise );
392 Abc_SclReadSurface( vOut, pPos, &pTime->
pCellFall );
393 Abc_SclReadSurface( vOut, pPos, &pTime->
pRiseTrans );
394 Abc_SclReadSurface( vOut, pPos, &pTime->
pFallTrans );
408 p = Abc_SclLibAlloc();
409 if ( !Abc_SclReadLibrary( vOut, &
Pos,
p ) )
423 pFile = fopen( pFileName,
"rb" );
426 printf(
"Cannot open file \"%s\" for reading.\n", pFileName );
431 nFileSize = ftell( pFile );
434 vOut = Vec_StrAlloc( nFileSize );
436 assert( nFileSize == Vec_StrSize(vOut) );
437 nFileSize = fread( Vec_StrArray(vOut), 1, Vec_StrSize(vOut), pFile );
438 assert( nFileSize == Vec_StrSize(vOut) );
443 p->pFileName = Abc_UtilStrsav( pFileName );
467 Vec_StrPutI( vOut, Vec_FltSize(&
p->vIndex0) );
469 Vec_StrPutF( vOut, Entry );
471 Vec_StrPutI( vOut, Vec_FltSize(&
p->vIndex1) );
473 Vec_StrPutF( vOut, Entry );
477 Vec_StrPutF( vOut, Entry );
479 for ( i = 0; i < 3; i++ )
480 Vec_StrPutF( vOut,
p->approx[0][i] );
481 for ( i = 0; i < 4; i++ )
482 Vec_StrPutF( vOut,
p->approx[1][i] );
483 for ( i = 0; i < 6; i++ )
484 Vec_StrPutF( vOut,
p->approx[2][i] );
486static void Abc_SclWriteLibraryCellsOnly(
Vec_Str_t * vOut,
SC_Lib *
p,
int fAddOn )
497 Vec_StrPush( vOut,
'L' );
498 Vec_StrPush( vOut,
'0'+(
char)fAddOn );
499 Vec_StrPush( vOut,
'_' );
502 Vec_StrPutS( vOut, pCell->
pName );
503 Vec_StrPutF( vOut, pCell->
area );
504 Vec_StrPutF( vOut, pCell->
leakage );
508 Vec_StrPutI( vOut, pCell->
n_inputs);
514 Vec_StrPutS( vOut, pPin->
pName );
515 Vec_StrPutF( vOut, pPin->
rise_cap );
516 Vec_StrPutF( vOut, pPin->
fall_cap );
525 Vec_StrPutS( vOut, pPin->
pName );
528 Vec_StrPutI( vOut, pCell->
n_inputs );
536 Vec_StrPutW( vOut, uWord );
542 Vec_StrPutS( vOut, pRTime->
pName );
543 Vec_StrPutI( vOut, Vec_PtrSize(&pRTime->
vTimings) );
547 if ( Vec_PtrSize(&pRTime->
vTimings) == 1 )
552 Vec_StrPutI( vOut, (
int)pTime->
tsense);
553 Abc_SclWriteSurface( vOut, &pTime->
pCellRise );
554 Abc_SclWriteSurface( vOut, &pTime->
pCellFall );
555 Abc_SclWriteSurface( vOut, &pTime->
pRiseTrans );
556 Abc_SclWriteSurface( vOut, &pTime->
pFallTrans );
567 int i, n_valid_cells = 0;
571 return n_valid_cells;
573static void Abc_SclWriteLibrary(
Vec_Str_t * vOut,
SC_Lib *
p,
int nExtra,
int fUsePrefix )
583 Vec_StrPutS( vOut,
p->pName );
584 Vec_StrPutS( vOut,
p->default_wire_load );
585 Vec_StrPutS( vOut,
p->default_wire_load_sel );
586 Vec_StrPutF( vOut,
p->default_max_out_slew );
589 assert(
p->unit_cap_snd >= 0 );
590 Vec_StrPutI( vOut,
p->unit_time );
591 Vec_StrPutF( vOut,
p->unit_cap_fst );
592 Vec_StrPutI( vOut,
p->unit_cap_snd );
595 Vec_StrPutI( vOut, Vec_PtrSize(&
p->vWireLoads) );
598 Vec_StrPutS( vOut, pWL->
pName );
599 Vec_StrPutF( vOut, pWL->
cap );
600 Vec_StrPutF( vOut, pWL->
slope );
602 Vec_StrPutI( vOut, Vec_IntSize(&pWL->
vFanout) );
603 for ( j = 0; j < Vec_IntSize(&pWL->
vFanout); j++ )
605 Vec_StrPutI( vOut, Vec_IntEntry(&pWL->
vFanout, j) );
606 Vec_StrPutF( vOut, Vec_FltEntry(&pWL->
vLen, j) );
611 Vec_StrPutI( vOut, Vec_PtrSize(&
p->vWireLoadSels) );
614 Vec_StrPutS( vOut, pWLS->
pName );
615 Vec_StrPutI( vOut, Vec_FltSize(&pWLS->
vAreaFrom) );
616 for ( j = 0; j < Vec_FltSize(&pWLS->
vAreaFrom); j++)
618 Vec_StrPutF( vOut, Vec_FltEntry(&pWLS->
vAreaFrom, j) );
619 Vec_StrPutF( vOut, Vec_FltEntry(&pWLS->
vAreaTo, j) );
620 Vec_StrPutS( vOut, (
char *)Vec_PtrEntry(&pWLS->
vWireLoadModel, j) );
626 Vec_StrPutI( vOut, n_valid_cells + nExtra );
627 Abc_SclWriteLibraryCellsOnly( vOut,
p, fUsePrefix ? 1 : 0 );
632 vOut = Vec_StrAlloc( 10000 );
633 Abc_SclWriteLibrary( vOut,
p, 0, 0 );
634 if ( Vec_StrSize(vOut) > 0 )
636 FILE * pFile = fopen( pFileName,
"wb" );
638 printf(
"Cannot open file \"%s\" for writing.\n", pFileName );
641 fwrite( Vec_StrArray(vOut), 1, Vec_StrSize(vOut), pFile );
660static void Abc_SclWriteSurfaceText( FILE * s,
SC_Surface *
p )
666 fprintf( s,
" index_1(\"" );
668 fprintf( s,
"%f%s", Entry, i == Vec_FltSize(&
p->vIndex0)-1 ?
"":
", " );
669 fprintf( s,
"\");\n" );
671 fprintf( s,
" index_2(\"" );
673 fprintf( s,
"%f%s", Entry, i == Vec_FltSize(&
p->vIndex1)-1 ?
"":
", " );
674 fprintf( s,
"\");\n" );
676 fprintf( s,
" values (\"" );
680 fprintf( s,
"%f%s", Entry, i == Vec_PtrSize(&
p->vData)-1 && k == Vec_FltSize(vVec)-1 ?
"\");":
", " );
681 if ( i == Vec_PtrSize(&
p->vData)-1 )
685 fprintf( s,
"\\\n" );
706static void Abc_SclWriteLibraryText( FILE * s,
SC_Lib *
p )
714 fprintf( s,
"/* This Liberty file was generated by ABC on %s */\n",
Extra_TimeStamp() );
715 fprintf( s,
"/* The original unabridged library came from file \"%s\".*/\n\n",
p->pFileName );
718 fprintf( s,
"library(%s) {\n\n",
p->pName );
719 if (
p->default_wire_load &&
strlen(
p->default_wire_load) )
720 fprintf( s,
" default_wire_load : \"%s\";\n",
p->default_wire_load );
721 if (
p->default_wire_load_sel &&
strlen(
p->default_wire_load_sel) )
722 fprintf( s,
" default_wire_load_selection : \"%s\";\n",
p->default_wire_load_sel );
723 if (
p->default_max_out_slew != -1 )
724 fprintf( s,
" default_max_transition : %f;\n",
p->default_max_out_slew );
725 if (
p->unit_time == 9 )
726 fprintf( s,
" time_unit : \"1ns\";\n" );
727 else if (
p->unit_time == 10 )
728 fprintf( s,
" time_unit : \"100ps\";\n" );
729 else if (
p->unit_time == 11 )
730 fprintf( s,
" time_unit : \"10ps\";\n" );
731 else if (
p->unit_time == 12 )
732 fprintf( s,
" time_unit : \"1ps\";\n" );
734 fprintf( s,
" capacitive_load_unit(%.1f,%s);\n",
p->unit_cap_fst,
p->unit_cap_snd == 12 ?
"pf" :
"ff" );
740 fprintf( s,
" wire_load(\"%s\") {\n", pWL->
pName );
741 fprintf( s,
" capacitance : %f;\n", pWL->
cap );
742 fprintf( s,
" slope : %f;\n", pWL->
slope );
743 for ( j = 0; j < Vec_IntSize(&pWL->
vFanout); j++ )
744 fprintf( s,
" fanout_length( %d, %f );\n", Vec_IntEntry(&pWL->
vFanout, j), Vec_FltEntry(&pWL->
vLen, j) );
745 fprintf( s,
" }\n\n" );
751 fprintf( s,
" wire_load_selection(\"%s\") {\n", pWLS->
pName );
752 for ( j = 0; j < Vec_FltSize(&pWLS->
vAreaFrom); j++)
753 fprintf( s,
" wire_load_from_area( %f, %f, %s );\n",
755 Vec_FltEntry(&pWLS->
vAreaTo, j),
757 fprintf( s,
" }\n\n" );
772 fprintf( s,
" cell(%s) {\n", pCell->
pName );
773 fprintf( s,
" /* n_inputs = %d n_outputs = %d */\n", pCell->
n_inputs, pCell->
n_outputs );
774 fprintf( s,
" area : %f;\n", pCell->
area );
775 fprintf( s,
" cell_leakage_power : %f;\n", pCell->
leakage );
781 fprintf( s,
" pin(%s) {\n", pPin->
pName );
782 fprintf( s,
" direction : %s;\n",
"input" );
783 fprintf( s,
" fall_capacitance : %f;\n", pPin->
fall_cap );
784 fprintf( s,
" rise_capacitance : %f;\n", pPin->
rise_cap );
785 fprintf( s,
" }\n" );
793 fprintf( s,
" pin(%s) {\n", pPin->
pName );
794 fprintf( s,
" direction : %s;\n",
"output" );
795 fprintf( s,
" max_capacitance : %f;\n", pPin->
max_out_cap );
796 fprintf( s,
" max_transition : %f;\n", pPin->
max_out_slew );
798 fprintf( s,
" /* truth table = " );
800 fprintf( s,
" */\n" );
806 if ( Vec_PtrSize(&pRTime->
vTimings) == 1 )
809 fprintf( s,
" timing() {\n" );
810 fprintf( s,
" related_pin : \"%s\"\n", pRTime->
pName );
812 fprintf( s,
" timing_sense : positive_unate;\n" );
814 fprintf( s,
" timing_sense : negative_unate;\n" );
816 fprintf( s,
" timing_sense : non_unate;\n" );
819 fprintf( s,
" cell_rise() {\n" );
820 Abc_SclWriteSurfaceText( s, &pTime->
pCellRise );
821 fprintf( s,
" }\n" );
823 fprintf( s,
" cell_fall() {\n" );
824 Abc_SclWriteSurfaceText( s, &pTime->
pCellFall );
825 fprintf( s,
" }\n" );
827 fprintf( s,
" rise_transition() {\n" );
828 Abc_SclWriteSurfaceText( s, &pTime->
pRiseTrans );
829 fprintf( s,
" }\n" );
831 fprintf( s,
" fall_transition() {\n" );
832 Abc_SclWriteSurfaceText( s, &pTime->
pFallTrans );
833 fprintf( s,
" }\n" );
834 fprintf( s,
" }\n" );
839 fprintf( s,
" }\n" );
841 fprintf( s,
" }\n" );
843 fprintf( s,
"}\n\n" );
847 FILE * pFile = fopen( pFileName,
"wb" );
849 printf(
"Cannot open text file \"%s\" for writing.\n", pFileName );
852 Abc_SclWriteLibraryText( pFile,
p );
854 printf(
"Dumped internal library with %d cells into Liberty file \"%s\".\n", SC_LibCellNum(
p), pFileName );
871 Vec_Str_t * vOut = Vec_StrAlloc( 10000 );
873 Abc_SclWriteLibrary( vOut, pLib1, n_valid_cells2, fUsePrefix );
874 Abc_SclWriteLibraryCellsOnly( vOut, pLib2, fUsePrefix ? 2 : 0 );
876 p->pFileName = Abc_UtilStrsav( pLib1->
pFileName );
880 printf(
"Updated library \"%s\" with additional %d cells from library \"%s\".\n", pLib1->
pName, n_valid_cells2, pLib2->
pName );
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
struct Vec_Str_t_ Vec_Str_t
void Extra_PrintHex(FILE *pFile, unsigned *pTruth, int nVars)
unsigned __int64 word
DECLARATIONS ///.
int Mio_GateReadPinNum(Mio_Gate_t *pGate)
Vec_Wrd_t * Mio_ParseFormulaTruth(char *pFormInit, char **ppVarNames, int nVars)
char * Mio_LibraryReadName(Mio_Library_t *pLib)
DECLARATIONS ///.
Mio_PinPhase_t
INCLUDES ///.
double Mio_GateReadArea(Mio_Gate_t *pGate)
struct Mio_LibraryStruct_t_ Mio_Library_t
Mio_PinPhase_t Mio_PinReadPhase(Mio_Pin_t *pPin)
char * Mio_PinReadName(Mio_Pin_t *pPin)
#define Mio_LibraryForEachGate(Lib, Gate)
GLOBAL VARIABLES ///.
char * Mio_GateReadName(Mio_Gate_t *pGate)
struct Mio_PinStruct_t_ Mio_Pin_t
char * Mio_GateReadOutName(Mio_Gate_t *pGate)
#define Mio_GateForEachPin(Gate, Pin)
struct Mio_GateStruct_t_ Mio_Gate_t
char * Mio_GateReadForm(Mio_Gate_t *pGate)
word * Mio_GateReadTruthP(Mio_Gate_t *pGate)
void Abc_SclWriteScl(char *pFileName, SC_Lib *p)
int Abc_SclCountValidCells(SC_Lib *p)
SC_Lib * Abc_SclMergeLibraries(SC_Lib *pLib1, SC_Lib *pLib2, int fUsePrefix)
void Abc_SclWriteLiberty(char *pFileName, SC_Lib *p)
SC_Lib * Abc_SclReadFromStr(Vec_Str_t *vOut)
SC_Lib * Abc_SclReadFromFile(char *pFileName)
SC_Lib * Abc_SclReadFromGenlib(void *pLib0)
#define SC_CellForEachPinIn(p, pPin, i)
#define SC_PinForEachRTiming(p, pRTime, i)
struct SC_Timing_ SC_Timing
#define SC_LibForEachCell(p, pCell, i)
#define SC_CellForEachPinOut(p, pPin, i)
struct SC_WireLoadSel_ SC_WireLoadSel
void Abc_SclLibNormalize(SC_Lib *p)
#define SC_LibForEachWireLoadSel(p, pWLS, i)
struct SC_Timings_ SC_Timings
void Abc_SclHashCells(SC_Lib *p)
void Abc_SclLinkCells(SC_Lib *p)
#define SC_LibForEachWireLoad(p, pWL, i)
struct SC_Surface_ SC_Surface
struct SC_WireLoad_ SC_WireLoad
STRUCTURE DEFINITIONS ///.
#define ABC_SCL_CUR_VERSION
INCLUDES ///.
#define Vec_FltForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Ptr_t_ Vec_Ptr_t
INCLUDES ///.
#define Vec_PtrForEachEntry(Type, vVec, pEntry, i)
MACRO DEFINITIONS ///.
#define Vec_WrdForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.