@@ -160,48 +160,38 @@ def run_iverilog(objs, display=False, top=None, outputfile=None,
160160 cmd .append (outputfile )
161161
162162 # encoding: 'utf-8' ?
163- encode = sys .getdefaultencoding ()
163+ encoding = sys .getdefaultencoding ()
164164
165165 code = _to_code (objs )
166- tmp = tempfile .NamedTemporaryFile ()
167- tmp .write (code .encode (encode ))
166+
167+ if os .name == 'nt' :
168+ fd , path = tempfile .mkstemp ()
169+ os .close (fd )
170+ tmp = open (path , 'w+b' )
171+ else :
172+ tmp = tempfile .NamedTemporaryFile ()
173+
174+ tmp .write (code .encode (encoding ))
168175 tmp .read ()
169176 filename = tmp .name
170177
171178 cmd .append (filename )
172179
173180 # synthesis
174- p = subprocess .Popen (' ' .join (cmd ), shell = True , stdout = subprocess .PIPE )
175- syn_rslt = []
176- while True :
177- stdout_data = p .stdout .readline ()
178- syn_rslt .append (stdout_data .decode (encode ))
179- if display :
180- print (stdout_data , end = '' )
181- if not stdout_data :
182- break
183- p .wait ()
184- p .stdout .close ()
185- syn_rslt = '' .join (syn_rslt )
181+ syn_rslt = _exec (' ' .join (cmd ), encoding , display )
186182
187183 # simulation
188- p = subprocess .Popen ('./' + outputfile , shell = True ,
189- stdout = subprocess .PIPE )
190- sim_rslt = []
191- while True :
192- stdout_data = p .stdout .readline ()
193- sim_rslt .append (stdout_data .decode (encode ))
194- if display :
195- print (stdout_data , end = '' )
196- if not stdout_data :
197- break
198- p .wait ()
199- p .stdout .close ()
200- sim_rslt = '' .join (sim_rslt )
184+ cmd = []
185+ cmd .append ('vvp' )
186+ cmd .append (outputfile )
187+ sim_rslt = _exec (' ' .join (cmd ), encoding , display )
201188
202189 # close temporal source code file
203190 tmp .close ()
204191
192+ if os .name == 'nt' :
193+ os .remove (path )
194+
205195 return '' .join ([syn_rslt , sim_rslt ])
206196
207197
@@ -255,48 +245,42 @@ def run_vcs(objs, display=False, top=None, outputfile=None,
255245 cmd .append (outputfile )
256246
257247 # encoding: 'utf-8' ?
258- encode = sys .getdefaultencoding ()
248+ encoding = sys .getdefaultencoding ()
259249
260250 code = _to_code (objs )
261- tmp = tempfile .NamedTemporaryFile ()
262- tmp .write (code .encode (encode ))
251+
252+ if os .name == 'nt' :
253+ fd , path = tempfile .mkstemp ()
254+ os .close (fd )
255+ tmp = open (path , 'w+b' )
256+ else :
257+ tmp = tempfile .NamedTemporaryFile ()
258+
259+ tmp .write (code .encode (encoding ))
263260 tmp .read ()
264261 filename = tmp .name
265262
266263 cmd .append (filename )
267264
268265 # synthesis
269- p = subprocess .Popen (' ' .join (cmd ), shell = True , stdout = subprocess .PIPE )
270- syn_rslt = []
271- while True :
272- stdout_data = p .stdout .readline ()
273- syn_rslt .append (stdout_data .decode (encode ))
274- if display :
275- print (stdout_data , end = '' )
276- if not stdout_data :
277- break
278- p .wait ()
279- p .stdout .close ()
280- syn_rslt = '' .join (syn_rslt )
266+ syn_rslt = _exec (' ' .join (cmd ), encoding , display )
281267
282268 # simulation
283- p = subprocess .Popen ('./' + outputfile , shell = True ,
284- stdout = subprocess .PIPE )
285- sim_rslt = []
286- while True :
287- stdout_data = p .stdout .readline ()
288- sim_rslt .append (stdout_data .decode (encode ))
289- if display :
290- print (stdout_data , end = '' )
291- if not stdout_data :
292- break
293- p .wait ()
294- p .stdout .close ()
295- sim_rslt = '' .join (sim_rslt )
269+ cmd = []
270+
271+ if os .name == 'nt' :
272+ cmd .append (outputfile )
273+ else :
274+ cmd .append ('./' + outputfile )
275+
276+ sim_rslt = _exec (' ' .join (cmd ), encoding , display )
296277
297278 # close temporal source code file
298279 tmp .close ()
299280
281+ if os .name == 'nt' :
282+ os .remove (path )
283+
300284 return '' .join ([syn_rslt , sim_rslt ])
301285
302286
@@ -339,48 +323,39 @@ def run_modelsim(objs, display=False, top=None, outputfile=None,
339323 cmd .append (l )
340324
341325 # encoding: 'utf-8' ?
342- encode = sys .getdefaultencoding ()
326+ encoding = sys .getdefaultencoding ()
343327
344328 code = _to_code (objs )
345- tmp = tempfile .NamedTemporaryFile ()
346- tmp .write (code .encode (encode ))
329+
330+ if os .name == 'nt' :
331+ fd , path = tempfile .mkstemp ()
332+ os .close (fd )
333+ tmp = open (path , 'w+b' )
334+ else :
335+ tmp = tempfile .NamedTemporaryFile ()
336+
337+ tmp .write (code .encode (encoding ))
347338 tmp .read ()
348339 filename = tmp .name
349340
350341 cmd .append (filename )
351342
352343 # synthesis
353- p = subprocess .Popen (' ' .join (cmd ), shell = True , stdout = subprocess .PIPE )
354- syn_rslt = []
355- while True :
356- stdout_data = p .stdout .readline ()
357- syn_rslt .append (stdout_data .decode (encode ))
358- if display :
359- print (stdout_data , end = '' )
360- if not stdout_data :
361- break
362- p .wait ()
363- p .stdout .close ()
364- syn_rslt = '' .join (syn_rslt )
344+ syn_rslt = _exec (' ' .join (cmd ), encoding , display )
365345
366346 # simulation
367- p = subprocess .Popen (
368- 'vsim -c ' + top + ' -do \" run -all\" ' , shell = True , stdout = subprocess .PIPE )
369- sim_rslt = []
370- while True :
371- stdout_data = p .stdout .readline ()
372- sim_rslt .append (stdout_data .decode (encode ))
373- if display :
374- print (stdout_data , end = '' )
375- if not stdout_data :
376- break
377- p .wait ()
378- p .stdout .close ()
379- sim_rslt = '' .join (sim_rslt )
347+ cmd = []
348+ cmd .append ('vsim -c' )
349+ cmd .append (top )
350+ cmd .append ('-do \" run -all\" ' )
351+ sim_rslt = _exec (' ' .join (cmd ), encoding , display )
380352
381353 # close temporal source code file
382354 tmp .close ()
383355
356+ if os .name == 'nt' :
357+ os .remove (path )
358+
384359 return '' .join ([syn_rslt , sim_rslt ])
385360
386361
@@ -579,53 +554,25 @@ def run_verilator(objs, display=False, top=None, outputfile=None,
579554 # cmd.append(clk.name)
580555
581556 # encoding: 'utf-8' ?
582- encode = sys .getdefaultencoding ()
557+ encoding = sys .getdefaultencoding ()
583558
584559 # synthesis
585- p = subprocess .Popen (' ' .join (cmd ), shell = True , stdout = subprocess .PIPE )
586- syn_rslt = []
587- while True :
588- stdout_data = p .stdout .readline ()
589- syn_rslt .append (stdout_data .decode (encode ))
590- if display :
591- print (stdout_data , end = '' )
592- if not stdout_data :
593- break
594- p .wait ()
595- p .stdout .close ()
596- syn_rslt = '' .join (syn_rslt )
560+ syn_rslt = _exec (' ' .join (cmd ), encoding , display )
597561
598562 # make
599563 make = ['make -C' , outputfile , '-j -f' ,
600564 'V' + verilog_prefix + '.mk' , 'V' + verilog_prefix ]
601-
602- p = subprocess .Popen (' ' .join (make ), shell = True , stdout = subprocess .PIPE )
603- make_rslt = []
604- while True :
605- stdout_data = p .stdout .readline ()
606- make_rslt .append (stdout_data .decode (encode ))
607- if display :
608- print (stdout_data , end = '' )
609- if not stdout_data :
610- break
611- p .wait ()
612- p .stdout .close ()
613- make_rslt = '' .join (make_rslt )
565+ make_rslt = _exec (' ' .join (make ), encoding , display )
614566
615567 # simulation
616- p = subprocess .Popen ('./' + outputfile + '/' + 'V' + verilog_prefix , shell = True ,
617- stdout = subprocess .PIPE )
618- sim_rslt = []
619- while True :
620- stdout_data = p .stdout .readline ()
621- sim_rslt .append (stdout_data .decode (encode ))
622- if display :
623- print (stdout_data , end = '' )
624- if not stdout_data :
625- break
626- p .wait ()
627- p .stdout .close ()
628- sim_rslt = '' .join (sim_rslt )
568+ cmd = []
569+
570+ if os .name == 'nt' :
571+ cmd .append (outputfile + '/' + 'V' + verilog_prefix )
572+ else :
573+ cmd .append ('./' + outputfile + '/' + 'V' + verilog_prefix )
574+
575+ sim_rslt = _exec (' ' .join (cmd ), encoding , display )
629576
630577 # return ''.join([syn_rslt, make_rslt, sim_rslt])
631578 return sim_rslt
@@ -725,3 +672,27 @@ def view_waveform(self, filename='uut.vcd', background=False):
725672
726673 raise NotImplementedError (
727674 "not supported waveform viewer: '%s'" % self .wave )
675+
676+
677+ def _exec (cmd , encoding , display = False ):
678+ if display :
679+ p = subprocess .Popen (cmd , shell = True , stdout = subprocess .PIPE )
680+ rslt = []
681+
682+ while True :
683+ stdout_data = p .stdout .readline ()
684+ out = stdout_data .decode (encoding )
685+ rslt .append (out )
686+ print (out , end = '' )
687+ if not stdout_data :
688+ break
689+
690+ p .wait ()
691+ p .stdout .close ()
692+ rslt = '' .join (rslt )
693+
694+ else :
695+ b = subprocess .check_output (cmd , shell = True )
696+ rslt = b .decode (encoding )
697+
698+ return rslt
0 commit comments