python版-Xilinx MIG IP IO口自動生成XDC腳本

自從我手動標註了1h的DDR3 IO位置之後,我感到渾身難受,這種活還是給電腦比較好。

備註:csv文件是用cadence導出的。

# -*- coding: utf-8 -*- 

import os
import os.path
import csv
import re

#打開文件
#filePath = 'ddr3_io.csv'
filePath = input('請輸入原始CSV文件全路徑:\n')

netPortMap = [
('DDR3_DIMM1_CAS_N' , 'ddr3_cas_n'),         #0
('DDR3_DIMM1_CK0_N', 'ddr3_ck_n[0]'),       #1
('DDR3_DIMM1_CK0_P', 'ddr3_ck_p[0]'),       #2
('DDR3_DIMM1_CKE0', 'ddr3_cke[0]'),           #3
('DDR3_DIMM1_CS0_N', 'ddr3_cs_n[0]'),       #4
('DDR3_DIMM1_ODT0_N', 'ddr3_odt[0]'),       #5
('DDR3_DIMM1_RAS_N', 'ddr3_ras_n'),          #6
('DDR3_DIMM1_WE_N', 'ddr3_we_n'),              #7
('DDR3_DIMM1_RESET_N', 'ddr3_reset_n'),    #8

('DDR3_DIMM1_DM', 'ddr3_dm'),                     #9
('DDR3_DIMM1_DQ', 'ddr3_dq'),                     #10
('DDR3_DIMM1_A', 'ddr3_addr'),                   #11
('DDR3_DIMM1_BA', 'ddr3_ba'),                     #12

('DDR3_DIMM1_DQS', 'ddr3_dqs'),                  #13

('FPGA_Name', 'U1'),                                     #14

]
#統計約束數量
xdcDict={
0:0, 
1:0, 
2:0, 
3:0, 
4:0, 
5:0, 
6:0, 
7:0, 
8:0, 
9:0, 
10:0, 
11:0, 
12:0, 
13:0, 

}
#fun defs
#匹配網絡名稱    
def findNetNameInMap(row):
    for index in range(0,  14):
        answer = 'err'
        netName = row[0]
        if netName.find(netPortMap[index][0]) != -1:
            if netName.find(netPortMap[13][0]) != -1: #對DQS進行第二次判斷
                answer = (row[0],  netPortMap[13][0],  netPortMap[13][1], 13)
            else:
                answer = (row[0],  netPortMap[index][0],  netPortMap[index][1], index)
            return answer
    return answer
#生成XDC約束
def genXDCLine(netName,  netNameNoIndex,  portName,  number, originString):
    originStringSplit = originString.split(' ')
    for item in originStringSplit:         #獲取FPGA引腳位置
            if item.find(netPortMap[14][1]+'.') != -1:
                pinLOC = item[len(netPortMap[14][1]+'.'):]      
                
    if number <= 8: #固定名稱的引腳                
        xdcLine = 'set_property PACKAGE_PIN '+pinLOC+' [get_ports {'+portName+'}]'
        #print(xdcLine)
    if 9 <= number <= 12: #DM,DQ,ADDR, BA單端信號
        portNameIndex = netName[len(netNameNoIndex):]
        xdcLine = 'set_property PACKAGE_PIN '+pinLOC+' [get_ports {'+portName+'['+portNameIndex+']}]'
        #print(xdcLine)    
    if number == 13:  #DQS,差分信號
        portNameRes = netName[len(netNameNoIndex):]
        #print(portNameRes)
        portNameIndex = re.sub("\D", "", portNameRes)  #去掉非數字字符,得到索引
        portNamePolarity = re.sub("[^a-zA-Z]", "", portNameRes) #去掉非字母字符,得到極性
        portNamePolarity = portNamePolarity.lower()
        #print(portNameIndex,  portNamePolarity)
        xdcLine = 'set_property PACKAGE_PIN '+pinLOC+' [get_ports {'+portName+'_'+portNamePolarity+'['+portNameIndex+']}]'
        #print(xdcLine)
    return xdcLine
#process start            
xdcFilePath=filePath.replace('.csv', '.xdc')
xdcfile = open(xdcFilePath,  'w')

with open(filePath, 'r', encoding='utf-8') as csvfile:
    fileContent = csv.reader(csvfile,  delimiter=',')
    for row in fileContent:                          #遍歷每行  
       # print ("讀取的數據爲: %s" % (row[0]))
        
        answer = findNetNameInMap(row)
        #print (answer,  row[1])
        if answer != 'err':
            xdcLine = genXDCLine(netName=answer[0], netNameNoIndex = answer[1], portName = answer[2],  number= int(answer[3]), originString=row[1])
            xdcfile.write(xdcLine+'\n')
            #print(answer[3])
            xdcDict[answer[3]] = xdcDict[answer[3]] + 1
        
        
xdcfile.close()
print('============================================')
print('約束文件已生成,並保存爲:'+xdcFilePath)
print('約束數量統計==============================')
for key in xdcDict:
    print(netPortMap[key][0] + ':    '+str(xdcDict[key]))

        

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章