| import re | 
 |  | 
 |  | 
 | def parse_pcf(f, pin_map, icecube2_hacks=False): | 
 |     pcf_data = {} | 
 |     for i, oline in enumerate(f): | 
 |         line = oline | 
 |         if icecube2_hacks and not re.search(" # ICE_(GB_)?IO", line): | 
 |             continue | 
 |         line = re.sub(r"#.*", "", line.strip()).split() | 
 |         if "--warn-no-port" in line: | 
 |             line.remove("--warn-no-port") | 
 |         if len(line) and line[0] == "set_io": | 
 |             p = line[1] | 
 |             if icecube2_hacks: | 
 |                 p = p.lower() | 
 |                 p = re.sub(r"_ibuf$", "", p) | 
 |                 p = re.sub(r"_obuft$", "", p) | 
 |                 p = re.sub(r"_obuf$", "", p) | 
 |                 p = re.sub(r"_gb_io$", "", p) | 
 |                 p = re.sub(r"_pad(_[0-9]+|)$", r"\1", p) | 
 |             if not re.match(r"[a-zA-Z_][a-zA-Z0-9_]*(\[[0-9]*\])?$", p): | 
 |                 p = "\\%s " % p | 
 |             if len(line) > 3: | 
 |                 pinloc = tuple([int(s) for s in line[2:]]) | 
 |             else: | 
 |                 pinloc = (line[2], ) | 
 |  | 
 |             for loc in pinloc: | 
 |                 if loc not in pin_map: | 
 |                     raise SyntaxError( | 
 |                         """\ | 
 | Pin name {} doesn't exist! | 
 | Line: {} | 
 | {}""".format(loc, i, oline) | 
 |                     ) | 
 |                 pcf_data[p] = (pin_map[loc], oline.strip()) | 
 |     return pcf_data |