Seite 1 von 1

Netzliste parsen

Verfasst: Montag 2. April 2007, 13:21
von driver
Hallo Zusammen,
Ich beschäftige mich seit 2 Wochen mit Python.
Im Rahmen einer Studienarbeit, muss ich unter anderem mit Python ein paar lef_def-dateien parsen.

folgendes Problem :
gegeben ist eine Netzliste. Sie sieht in etwa so aus :


- net09081 ( a5773 P1 ) ( a828 P2 ) ;
- net09082 ( a599 P2 ) ( a6782 P3 ) ;
- net09083 ( a6002 P1 ) ( a9917 P3 ) ;
- net09084 ( a6040 P2 ) ( a8915 P2 ) ;
- net09085 ( a6183 P1 ) ( a8294 P1 ) ;


mein Vorschlag :

Code: Alles auswählen

for line in test_file.readlines() :
	if '- net' in line :
		netz = re.findall ( '- net\d+' , line )
		netze.append(netz)
		pin = re.findall( '(\sa\d+ P\d )' , line)
		pins.append(pin)
klappt auch wunderbar

Aber irgendwann tauchten Netze auf, mit großer Anzahl an Pins.
Dabei sind Zeilenumbrüche entstanden.

Z.B

- net00059 ( a10310 P1 ) ( a11576 P0 ) ( a11590 P0 ) ( a12177 P0 ) ( a1767 P0 )
( a3523 P0 ) ( a4125 P0 ) ( a497 P0 ) ( a6016 P0 ) ( a6762 P0 ) ( a7151 P0 )
( a8318 P0 ) ( a8599 P1 ) ( a9020 P0 ) ;


Meine Frage ist nun : Wie kann ich diese Zeilenumbrüche in meinem Programm berücksichtigen, so dass ich wie vorhin 2 gleichgroße Listen erhalte : netze und pins

Danke im Voraus
MfG driver

Verfasst: Montag 2. April 2007, 13:30
von Costi
hi!

wie waers mit sowas aenliches wie:

Code: Alles auswählen

for i in (';' + pins.replace('\n', '')).split(';- net'):
    ...

edit:
waere es nicht vorteilhafter ales in nen dict zu packen?

Verfasst: Montag 2. April 2007, 15:57
von BlackJack
Folgendes zieht aus einer Zeichenkette die den gesamten Quelltext enthält die Netzlisten und daraus dann jeweils die variablen Teile der Pins und speichert die Informationen in einem Dictionary.

Code: Alles auswählen

import re
from pprint import pprint

data = """
- net09081 ( a5773 P1 ) ( a828 P2 ) ;
- net09082 ( a599 P2 ) ( a6782 P3 ) ;
- net09083 ( a6002 P1 ) ( a9917 P3 ) ;
- net09084 ( a6040 P2 ) ( a8915 P2 ) ;
- net09085 ( a6183 P1 ) ( a8294 P1 ) ;
- net00059 ( a10310 P1 ) ( a11576 P0 ) ( a11590 P0 ) ( a12177 P0 ) ( a1767 P0 )
( a3523 P0 ) ( a4125 P0 ) ( a497 P0 ) ( a6016 P0 ) ( a6762 P0 ) ( a7151 P0 )
( a8318 P0 ) ( a8599 P1 ) ( a9020 P0 ) ;
"""

def main():
    nets = dict()
    for net_match in re.finditer(r'^- net(\d+)[^;]+;',
                                 data,
                                 re.DOTALL | re.MULTILINE):
        pins = re.findall(r'\( a(\d+) P(\d+) \)', net_match.group(0))
        nets[net_match.group(1)] = pins
    pprint(nets)

Verfasst: Donnerstag 5. April 2007, 19:56
von driver
Danke BlackJack :D
Das hat mir weiter geholfen

mfg
driver

Verfasst: Donnerstag 5. April 2007, 21:45
von BlackJack
Ich habe gerade gesehen das ich in dem ersten regulären Ausdruck gar keinen Punkt mehr habe, also ist das ``re.DOTALL`` überflüssig. :-)