www.pudn.com > noc.rar > netgen.py



import os, sys, string

if len(sys.argv) != 3 :
    print 'Usage: python getnet.py  '
    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 clk, rst;\n\n')

# ports of the network
for x in range(X):
    for y in range(Y):
        hf.write('\tsc_in< sc_bv > x%dy%ddin;\n'%(x,y))
        hf.write('\tsc_out< sc_bv > 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))

# routers
hf.write('\n')
for x in range(X):
    for y in range(Y):
        hf.write('\tECUBE_ROUTER *x%dy%d;\n'%(x,y))

# connections between routers
hf.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 > %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 routers
for n in range(max(X,Y)):
    hf.write( '\tsc_signal< sc_uint > addr%d;\n'%n)
    
# constructor
hf.write('\n\tSC_CTOR(NETWORK%dx%d){\n'%(X,Y))

# instantiate routers
for 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 routers
hf.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 dimensions
hf.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 variable

cf.write('\t%s %s("%s");\n\n'%(name,lname,lname))
    
# signal connected to ports of network
for x in range(X):
    for y in range(Y):
        cf.write('\tsc_signal< sc_bv > x%dy%ddin;\n'%(x,y))
        cf.write('\tsc_signal< sc_bv > 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 net
cf.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 processors
for 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 processors
for 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 processors
for 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 %s_en;\n'%drv)
        
        cf.write('\n')
        
# connect signals specific to data processors
for 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')


##########################################################################################
# tracing

cf.write('#ifndef NOVCD\n')
# network ports
for 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 network
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) ):
            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 routers
cf.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 processors
for 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()