1 /**CFile****************************************************************
2
3 FileName [fpga.c]
4
5 PackageName [MVSIS 1.3: Multi-valued logic synthesis system.]
6
7 Synopsis [Command file for the FPGA package.]
8
9 Author [MVSIS Group]
10
11 Affiliation [UC Berkeley]
12
13 Date [Ver. 2.0. Started - August 18, 2004.]
14
15 Revision [$Id: fpga.c,v 1.4 2004/10/28 17:36:07 alanmi Exp $]
16
17 ***********************************************************************/
18
19 #include "fpgaInt.h"
20 #include "base/main/main.h"
21
22 ABC_NAMESPACE_IMPL_START
23
24
25 ////////////////////////////////////////////////////////////////////////
26 /// DECLARATIONS ///
27 ////////////////////////////////////////////////////////////////////////
28
29 static int Fpga_CommandReadLibrary( Abc_Frame_t * pAbc, int argc, char **argv );
30 static int Fpga_CommandPrintLibrary( Abc_Frame_t * pAbc, int argc, char **argv );
31
32 // the library file format should be as follows:
33 /*
34 # The area/delay of k-variable LUTs:
35 # k area delay
36 1 1 1
37 2 2 2
38 3 4 3
39 4 8 4
40 5 16 5
41 6 32 6
42 */
43
44 ////////////////////////////////////////////////////////////////////////
45 /// FUNCTION DEFINITIONS ///
46 ////////////////////////////////////////////////////////////////////////
47
48 /**Function*************************************************************
49
50 Synopsis [Package initialization procedure.]
51
52 Description []
53
54 SideEffects []
55
56 SeeAlso []
57
58 ***********************************************************************/
Fpga_Init(Abc_Frame_t * pAbc)59 void Fpga_Init( Abc_Frame_t * pAbc )
60 {
61 // set the default library
62 //Fpga_LutLib_t s_LutLib = { "lutlib", 6, 0, {0,1,2,4,8,16,32}, {{0},{1},{2},{3},{4},{5},{6}} };
63 // Fpga_LutLib_t s_LutLib = { "lutlib", 5, 0, {0,1,1,1,1,1}, {{0},{1},{1},{1},{1},{1}} };
64 Fpga_LutLib_t s_LutLib = { "lutlib", 4, 0, {0,1,1,1,1}, {{0},{1},{1},{1},{1}} };
65 //Fpga_LutLib_t s_LutLib = { "lutlib", 3, 0, {0,1,1,1}, {{0},{1},{1},{1}} };
66
67 Abc_FrameSetLibLut( Fpga_LutLibDup(&s_LutLib) );
68
69 Cmd_CommandAdd( pAbc, "FPGA mapping", "read_lut", Fpga_CommandReadLibrary, 0 );
70 Cmd_CommandAdd( pAbc, "FPGA mapping", "print_lut", Fpga_CommandPrintLibrary, 0 );
71 }
72
73 /**Function*************************************************************
74
75 Synopsis [Package ending procedure.]
76
77 Description []
78
79 SideEffects []
80
81 SeeAlso []
82
83 ***********************************************************************/
Fpga_End(Abc_Frame_t * pAbc)84 void Fpga_End( Abc_Frame_t * pAbc )
85 {
86 Fpga_LutLibFree( (Fpga_LutLib_t *)Abc_FrameReadLibLut() );
87 }
88
89
90 /**Function*************************************************************
91
92 Synopsis [Command procedure to read LUT libraries.]
93
94 Description []
95
96 SideEffects []
97
98 SeeAlso []
99
100 ***********************************************************************/
Fpga_CommandReadLibrary(Abc_Frame_t * pAbc,int argc,char ** argv)101 int Fpga_CommandReadLibrary( Abc_Frame_t * pAbc, int argc, char **argv )
102 {
103 FILE * pFile;
104 FILE * pOut, * pErr;
105 Fpga_LutLib_t * pLib;
106 Abc_Ntk_t * pNet;
107 char * FileName;
108 int fVerbose;
109 int c;
110
111 pNet = Abc_FrameReadNtk(pAbc);
112 pOut = Abc_FrameReadOut(pAbc);
113 pErr = Abc_FrameReadErr(pAbc);
114
115 // set the defaults
116 fVerbose = 1;
117 Extra_UtilGetoptReset();
118 while ( (c = Extra_UtilGetopt(argc, argv, "vh")) != EOF )
119 {
120 switch (c)
121 {
122 case 'v':
123 fVerbose ^= 1;
124 break;
125 case 'h':
126 goto usage;
127 break;
128 default:
129 goto usage;
130 }
131 }
132
133
134 if ( argc != globalUtilOptind + 1 )
135 {
136 goto usage;
137 }
138
139 // get the input file name
140 FileName = argv[globalUtilOptind];
141 if ( (pFile = fopen( FileName, "r" )) == NULL )
142 {
143 fprintf( pErr, "Cannot open input file \"%s\". ", FileName );
144 if ( (FileName = Extra_FileGetSimilarName( FileName, ".genlib", ".lib", ".gen", ".g", NULL )) )
145 fprintf( pErr, "Did you mean \"%s\"?", FileName );
146 fprintf( pErr, "\n" );
147 return 1;
148 }
149 fclose( pFile );
150
151 // set the new network
152 pLib = Fpga_LutLibRead( FileName, fVerbose );
153 if ( pLib == NULL )
154 {
155 fprintf( pErr, "Reading LUT library has failed.\n" );
156 goto usage;
157 }
158 // replace the current library
159 Fpga_LutLibFree( (Fpga_LutLib_t *)Abc_FrameReadLibLut() );
160 Abc_FrameSetLibLut( pLib );
161 return 0;
162
163 usage:
164 fprintf( pErr, "usage: read_lut [-vh]\n");
165 fprintf( pErr, "\t read the LUT library from the file\n" );
166 fprintf( pErr, "\t-v : toggles enabling of verbose output [default = %s]\n", (fVerbose? "yes" : "no") );
167 fprintf( pErr, "\t-h : print the command usage\n");
168 fprintf( pErr, "\t \n");
169 fprintf( pErr, "\t File format for a LUT library:\n");
170 fprintf( pErr, "\t (the default library is shown)\n");
171 fprintf( pErr, "\t \n");
172 fprintf( pErr, "\t # The area/delay of k-variable LUTs:\n");
173 fprintf( pErr, "\t # k area delay\n");
174 fprintf( pErr, "\t 1 1 1\n");
175 fprintf( pErr, "\t 2 2 2\n");
176 fprintf( pErr, "\t 3 4 3\n");
177 fprintf( pErr, "\t 4 8 4\n");
178 fprintf( pErr, "\t 5 16 5\n");
179 fprintf( pErr, "\t 6 32 6\n");
180 return 1; /* error exit */
181 }
182
183 /**Function*************************************************************
184
185 Synopsis [Command procedure to read LUT libraries.]
186
187 Description []
188
189 SideEffects []
190
191 SeeAlso []
192
193 ***********************************************************************/
Fpga_CommandPrintLibrary(Abc_Frame_t * pAbc,int argc,char ** argv)194 int Fpga_CommandPrintLibrary( Abc_Frame_t * pAbc, int argc, char **argv )
195 {
196 FILE * pOut, * pErr;
197 Abc_Ntk_t * pNet;
198 int fVerbose;
199 int c;
200
201 pNet = Abc_FrameReadNtk(pAbc);
202 pOut = Abc_FrameReadOut(pAbc);
203 pErr = Abc_FrameReadErr(pAbc);
204
205 // set the defaults
206 fVerbose = 1;
207 Extra_UtilGetoptReset();
208 while ( (c = Extra_UtilGetopt(argc, argv, "vh")) != EOF )
209 {
210 switch (c)
211 {
212 case 'v':
213 fVerbose ^= 1;
214 break;
215 case 'h':
216 goto usage;
217 break;
218 default:
219 goto usage;
220 }
221 }
222
223
224 if ( argc != globalUtilOptind )
225 {
226 goto usage;
227 }
228
229 // set the new network
230 Fpga_LutLibPrint( (Fpga_LutLib_t *)Abc_FrameReadLibLut() );
231 return 0;
232
233 usage:
234 fprintf( pErr, "usage: print_lut [-vh]\n");
235 fprintf( pErr, "\t print the current LUT library\n" );
236 fprintf( pErr, "\t-v : toggles enabling of verbose output [default = %s]\n", (fVerbose? "yes" : "no") );
237 fprintf( pErr, "\t-h : print the command usage\n");
238 return 1; /* error exit */
239 }
240
241 /**Function*************************************************************
242
243 Synopsis [Sets simple LUT library.]
244
245 Description []
246
247 SideEffects []
248
249 SeeAlso []
250
251 ***********************************************************************/
Fpga_SetSimpleLutLib(int nLutSize)252 void Fpga_SetSimpleLutLib( int nLutSize )
253 {
254 Fpga_LutLib_t s_LutLib10= { "lutlib",10, 0, {0,1,1,1,1,1,1,1,1,1,1}, {{0},{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}} };
255 Fpga_LutLib_t s_LutLib9 = { "lutlib", 9, 0, {0,1,1,1,1,1,1,1,1,1}, {{0},{1},{1},{1},{1},{1},{1},{1},{1},{1}} };
256 Fpga_LutLib_t s_LutLib8 = { "lutlib", 8, 0, {0,1,1,1,1,1,1,1,1}, {{0},{1},{1},{1},{1},{1},{1},{1},{1}} };
257 Fpga_LutLib_t s_LutLib7 = { "lutlib", 7, 0, {0,1,1,1,1,1,1,1}, {{0},{1},{1},{1},{1},{1},{1},{1}} };
258 Fpga_LutLib_t s_LutLib6 = { "lutlib", 6, 0, {0,1,1,1,1,1,1}, {{0},{1},{1},{1},{1},{1},{1}} };
259 Fpga_LutLib_t s_LutLib5 = { "lutlib", 5, 0, {0,1,1,1,1,1}, {{0},{1},{1},{1},{1},{1}} };
260 Fpga_LutLib_t s_LutLib4 = { "lutlib", 4, 0, {0,1,1,1,1}, {{0},{1},{1},{1},{1}} };
261 Fpga_LutLib_t s_LutLib3 = { "lutlib", 3, 0, {0,1,1,1}, {{0},{1},{1},{1}} };
262 Fpga_LutLib_t * pLutLib;
263 assert( nLutSize >= 3 && nLutSize <= 10 );
264 switch ( nLutSize )
265 {
266 case 3: pLutLib = &s_LutLib3; break;
267 case 4: pLutLib = &s_LutLib4; break;
268 case 5: pLutLib = &s_LutLib5; break;
269 case 6: pLutLib = &s_LutLib6; break;
270 case 7: pLutLib = &s_LutLib7; break;
271 case 8: pLutLib = &s_LutLib8; break;
272 case 9: pLutLib = &s_LutLib9; break;
273 case 10: pLutLib = &s_LutLib10; break;
274 default: pLutLib = NULL; break;
275 }
276 if ( pLutLib == NULL )
277 return;
278 Fpga_LutLibFree( (Fpga_LutLib_t *)Abc_FrameReadLibLut() );
279 Abc_FrameSetLibLut( Fpga_LutLibDup(pLutLib) );
280 }
281
282 ////////////////////////////////////////////////////////////////////////
283 /// END OF FILE ///
284 ////////////////////////////////////////////////////////////////////////
285
286
287 ABC_NAMESPACE_IMPL_END
288
289