|  | 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 |