netgen.py

来自「基于4个mips核的noc设计」· Python 代码 · 共 267 行

PY
267
字号
import os, sys, stringif len(sys.argv) != 3 :    print 'Usage: python getnet.py <xdim> <ydim>'    sys.exit(1)    X, Y = map( int, sys.argv[1:3] )name = 'NETWORK%dx%d'%(X,Y)lname = string.lower(name)hf = open(lname+'.h','w')cf = open(lname+'.cpp','w')##########################################################################################hf.write('SC_MODULE(NETWORK%dx%d)\n{\n\n'%(X,Y))hf.write('\tsc_in<bool> clk, rst;\n\n')# ports of the networkfor x in range(X):    for y in range(Y):        hf.write('\tsc_in< sc_bv<FLIT_LEN> > x%dy%ddin;\n'%(x,y))        hf.write('\tsc_out< sc_bv<FLIT_LEN> > x%dy%ddout;\n'%(x,y))        hf.write('\tsc_in< bool > x%dy%dreq_net;\n'%(x,y))        hf.write('\tsc_out< bool > x%dy%dack_net;\n'%(x,y))        hf.write('\tsc_in< bool > x%dy%dack_dp;\n'%(x,y))        hf.write('\tsc_out< bool > x%dy%dreq_dp;\n'%(x,y))# routershf.write('\n')for x in range(X):    for y in range(Y):        hf.write('\tECUBE_ROUTER *x%dy%d;\n'%(x,y))# connections between routershf.write('\n')for x in range(X):    for y in range(Y):        nn, nx, ny = 'x%dy%d'%(x,y),'x%dy%d'%((x+1)%X,y), 'x%dy%d'%(x,(y+1)%Y)        for p, n in ( (nn,nx), (nn,ny) ):            hf.write('\tsc_signal< sc_bv<FLIT_LEN> > %s_%s_data;\n'%(p,n))            signals = ( 'ch0req', 'ch0ack', 'ch1req', 'ch1ack' )             hf.write('\tsc_signal< bool > %s;\n'%(string.join( map(lambda s,p=p,n=n:'%s_%s_%s'%(p,n,s),signals), ', ')))        hf.write('\n')# address signals for routersfor n in range(max(X,Y)):    hf.write( '\tsc_signal< sc_uint<ADDRESS_LEN> > addr%d;\n'%n)    # constructorhf.write('\n\tSC_CTOR(NETWORK%dx%d){\n'%(X,Y))# instantiate routersfor x in range(X):    for y in range(Y):        hf.write('\t\tx%dy%d = new ECUBE_ROUTER("x%dy%d");\n'%(x,y,x,y))# address signals for routershf.write('\n')for n in range(max(X,Y)):    hf.write( '\t\taddr%d = %d;\n'%(n,n))# connect routers to previous and next in both dimensionshf.write('\n')for x in range(X):    for y in range(Y):        n, nx, ny, px, py = 'x%dy%d'%(x,y), 'x%dy%d'%((x+1)%X,y), 'x%dy%d'%(x,(y+1)%Y), 'x%dy%d'%((x-1)%X,y), 'x%dy%d'%(x,(y-1)%Y)        hf.write('\t\t%s->clk(clk); %s->rst(rst);\n'%(n,n))        hf.write('\t\t%s->xaddr(addr%d); %s->yaddr(addr%d);\n'%(n,x,n,y))        hf.write('\t\t%s->din(%sdin); %s->dout(%sdout);\n'%(n,n,n,n))        hf.write('\t\t%s->dreq_in(%sreq_net); %s->dack_out(%sack_net);\n'%(n,n,n,n))        hf.write('\t\t%s->dreq_out(%sreq_dp); %s->dack_in(%sack_dp);\n'%(n,n,n,n))        hf.write('\t\t%s->xin(%s_%s_data);\n'%(n,px,n))        hf.write('\t\t%s->x0req_in(%s_%s_ch0req); %s->x0ack_out(%s_%s_ch0ack);\n'%(n,px,n,n,px,n))        hf.write('\t\t%s->xout(%s_%s_data);\n'%(n,n,nx))        hf.write('\t\t%s->x0req_out(%s_%s_ch0req); %s->x0ack_in(%s_%s_ch0ack);\n'%(n,n,nx,n,n,nx))        hf.write('\t\t%s->yin(%s_%s_data);\n'%(n,py,n))        hf.write('\t\t%s->y0req_in(%s_%s_ch0req); %s->y0ack_out(%s_%s_ch0ack);\n'%(n,py,n,n,py,n))        hf.write('\t\t%s->yout(%s_%s_data);\n'%(n,n,ny))        hf.write('\t\t%s->y0req_out(%s_%s_ch0req); %s->y0ack_in(%s_%s_ch0ack);\n'%(n,n,ny,n,n,ny))        hf.write('\t\t%s->x1req_in(%s_%s_ch1req); %s->x1ack_out(%s_%s_ch1ack);\n'%(n,px,n,n,px,n))        hf.write('\t\t%s->x1req_out(%s_%s_ch1req); %s->x1ack_in(%s_%s_ch1ack);\n'%(n,n,nx,n,n,nx))        hf.write('\t\t%s->y1req_in(%s_%s_ch1req); %s->y1ack_out(%s_%s_ch1ack);\n'%(n,py,n,n,py,n))        hf.write('\t\t%s->y1req_out(%s_%s_ch1req); %s->y1ack_in(%s_%s_ch1ack);\n'%(n,n,ny,n,n,ny))        hf.write('\n')        hf.write('\t}\n};\n\n')########################################################################################### network testbench# network variablecf.write('\t%s %s("%s");\n\n'%(name,lname,lname))    # signal connected to ports of networkfor x in range(X):    for y in range(Y):        cf.write('\tsc_signal< sc_bv<FLIT_LEN> > x%dy%ddin;\n'%(x,y))        cf.write('\tsc_signal< sc_bv<FLIT_LEN> > x%dy%ddout;\n'%(x,y))        cf.write('\tsc_signal< bool > x%dy%dreq_net;\n'%(x,y))        cf.write('\tsc_signal< bool > x%dy%dack_net;\n'%(x,y))        cf.write('\tsc_signal< bool > x%dy%dack_dp;\n'%(x,y))        cf.write('\tsc_signal< bool > x%dy%dreq_dp;\n\n'%(x,y))# connect signals to netcf.write('\t%s.clk(clk); %s.rst(rst);\n'%(lname,lname))for x in range(X):    for y in range(Y):        c = 'x%dy%d'%(x,y)        cf.write('\t%s.%sdin(%sdin);\n'%(lname,c,c))        cf.write('\t%s.%sdout(%sdout);\n'%(lname,c,c))        cf.write('\t%s.%sreq_net(%sreq_net);\n'%(lname,c,c))        cf.write('\t%s.%sack_net(%sack_net);\n'%(lname,c,c))        cf.write('\t%s.%sack_dp(%sack_dp);\n'%(lname,c,c))        cf.write('\t%s.%sreq_dp(%sreq_dp);\n\n'%(lname,c,c))# create data processorsfor x in range(X):    for y in range(Y):        c = 'x%dy%d'%(x,y)        d = 'dp_'+c        drv = 'drv%d%d'%(x,y)        cf.write('\tNETWORK_INTERFACE %s("%s");\n'%(d,d))        cf.write('\tNI_RAND_DRIVER %s("%s");\n'%(drv,drv))        # connect net signals to data processorsfor x in range(X):    for y in range(Y):        c = 'x%dy%d'%(x,y)        d = 'dp_'+c        cf.write('\t%s.data_out(%sdin);\n'%(d,c))        cf.write('\t%s.data_in(%sdout);\n'%(d,c))        cf.write('\t%s.req_out(%sreq_net);\n'%(d,c))        cf.write('\t%s.ack_in(%sack_net);\n'%(d,c))        cf.write('\t%s.ack_out(%sack_dp);\n'%(d,c))        cf.write('\t%s.req_in(%sreq_dp);\n\n'%(d,c))# create signals specific to data processorsfor x in range(X):    for y in range(Y):        c = 'x%dy%d'%(x,y)        d = 'dp_'+c        drv = 'drv%d%d'%(x,y)                for s in ('reg_data_in','reg_data_out'):            cf.write('\tsc_signal< sc_bv<32> > %s_%s;\n'%(d,s))                    for s in ('write_data','write_addr','send','read','data_rdy','send_rdy','packet_end', 'rcv_packet_end'):            cf.write('\tsc_signal< bool > %s_%s;\n'%(d,s))        cf.write('\tsc_signal<bool> %s_en;\n'%drv)                cf.write('\n')        # connect signals specific to data processorsfor x in range(X):    for y in range(Y):        c = 'x%dy%d'%(x,y)        d = 'dp_'+c        drv = 'drv%d%d'%(x,y)                cf.write('\t%s.clk(clk); %s.rst(rst);\n'%(d,d))        cf.write('\t%s.clk(clk); %s.rst(rst); %s.en(%s_en);\n'%(drv,drv,drv,drv))        cf.write('\t%s.x = %d; %s.y = %d; %s.maxx = %d; %s.maxy = %d;\n'%(drv,x,drv,y,drv,X-1,drv,Y-1))        for s in ('reg_data_in','write_data','write_addr','send','read','reg_data_out','data_rdy','send_rdy','packet_end','rcv_packet_end'):            cf.write('\t%s.%s(%s_%s);\n'%(d,s,d,s))            cf.write('\t%s.%s(%s_%s);\n'%(drv,s,d,s))        cf.write('\n')########################################################################################### tracingcf.write('#ifndef NOVCD\n')# network portsfor x in range(X):    for y in range(Y):        c = 'x%dy%d'%(x,y)        for s in ('din','dout','req_net','ack_net','req_dp','ack_dp'):            cf.write('\tsc_trace(tf, %s%s, "dp_%s.net.%s%s");\n'%(c,s,c,c,s))        cf.write('\n')# internal connections within networkfor x in range(X):    for y in range(Y):        nn, nx, ny = 'x%dy%d'%(x,y),'x%dy%d'%((x+1)%X,y), 'x%dy%d'%(x,(y+1)%Y)        for p, n in ( (nn,nx), (nn,ny) ):            for s in ( 'data', 'ch0req', 'ch0ack', 'ch1req', 'ch1ack' ):                cf.write('\tsc_trace(tf, %s.%s_%s_%s, "%s.%s_%s.%s_%s_%s");\n'%(lname,p,n,s,lname,p,n,p,n,s))# tracing of routerscf.write('\n')cf.write('#ifdef ROUTERVCD\n')for x in range(X):    for y in range(Y):        nn = 'x%dy%d'%(x,y)        for s in ('xydata','xyreq','xyack'):            cf.write('\tsc_trace(tf, %s.%s->%s, "%s.%s.%s");\n'%(lname,nn,s,lname,nn,s))                    for r in ('xrouter', 'yrouter'):            for s in ( 'data0in','data1in','data2in','data0out','data1out','data2out',                       'select0','select1','select2','rqs0','rqs1','rqs2',                       'req0in','req1in','req2in','req0out','req1out','req2out',                       'ack0in','ack1in','ack2in','ack0out','ack1out','ack2out',                       'arb_data0','arb_data1','arb_req0','arb_req1','arb_ack0','arb_ack1' ):                cf.write('\tsc_trace(tf, %s.%s->%s->%s, "%s.%s.%s.conn.%s");\n'%(lname,nn,r,s,lname,nn,r,s))            cf.write('\n')            for i in ('d','x0','x1'):                for s in ('data_latch','current_state','next_state',                          'header_select','end_of_route','start_of_packet','end_of_packet','header'):                    cf.write('\tsc_trace(tf, %s.%s->%s->%sinctrl->%s, "%s.%s.%s.%sinctrl.%s");\n'%(lname,nn,r,i,s,lname,nn,r,i,s))                cf.write('\n')            for i in ('d','x0','x1'):                for s in ('current_state','next_state','buffer','buffer_write','buffer_clear'):                    cf.write('\tsc_trace(tf, %s.%s->%s->%squeue->%s, "%s.%s.%s.%squeue.%s");\n'%(lname,nn,r,i,s,lname,nn,r,i,s))                cf.write('\n')            for s in ('arb_req0', 'arb_req1', 'arb_grant0', 'arb_grant1'):                cf.write('\tsc_trace(tf, %s.%s->%s->arbiter->%s, "%s.%s.%s.arbiter.%s");\n'%(lname,nn,r,s,lname,nn,r,s))            for i in '01' :                cf.write('\tsc_trace(tf, %s.%s->%s->arbiter->ch%sctrl->current_state, "%s.%s.%s.arbiter.ch%s.current_state");\n'%(lname,nn,r,i,lname,nn,r,i))                        cf.write('\tsc_trace(tf, %s.%s->%s->arbiter->arbiter->channel_busy, "%s.%s.%s.arbiter.arbiter.channel_busy");\n'%(lname,nn,r,lname,nn,r))            cf.write('\tsc_trace(tf, %s.%s->%s->arbiter->arbiter->selected_channel, "%s.%s.%s.arbiter.arbiter.selected_channel");\n'%(lname,nn,r,lname,nn,r))            cf.write('\tsc_trace(tf, %s.%s->%s->swtch->grant0, "%s.%s.%s.switch.grant0");\n'%(lname,nn,r,lname,nn,r))            cf.write('\tsc_trace(tf, %s.%s->%s->swtch->grant1, "%s.%s.%s.switch.grant1");\n'%(lname,nn,r,lname,nn,r))            cf.write('\tsc_trace(tf, %s.%s->%s->swtch->grant2, "%s.%s.%s.switch.grant2");\n'%(lname,nn,r,lname,nn,r))                        cf.write('\n')cf.write('#endif\n\n')                # tracing data processorsfor x in range(X):    for y in range(Y):        c = 'x%dy%d'%(x,y)        d = 'dp_'+c        for s in ('reg_data_in','write_data','write_addr','send','read','reg_data_out','data_rdy','send_rdy','packet_end','rcv_packet_end'):            cf.write('\tsc_trace(tf, %s_%s, "%s.%s");\n'%(d,s,d,s))        cf.write('\n')        for s in ('buffer_addr','buffer_in','buffer_out',                  'send_flit','next_send_flit','send_current_state','send_next_state',                  'rcv_flit','rcv_current_state'):            cf.write('\tsc_trace(tf, %s.%s, "%s.state.%s");\n'%(d,s,d,s))cf.write('#endif\n')hf.close()cf.close()

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?