function error(msg ,where) { if ("refdes" in ATTR) where = "in component " ATTR["refdes"] " " if (sym != "") where = where "symbol " sym " " where = where "near line " NR print "devmap summary error: " msg " (" where ")" > "/dev/stderr" fatal = 1 exit } function subs_devmap( fn,ln,line,v,A,useful) { fn=devmapdir "/" ATTR["devmap"] close(fn) useful = 0 for(ln = 0; (getline line < fn) > 0; ln++) { if ((line ~ "^#") || (line ~ "^[ \t]*$")) continue v = split(line, A, FS) if (A[1] == "attr") { sub("^attr[ \t]*", "", line) set_attr_str(line) } else error("invalid command in " fn ":" ln ": " A[1]) useful++ } if (ln == 0) error("can't open devmap " fn) if (useful == 0) error("no useful lines in " fn) close(fn) } function set_pin(name, val ,v,n,P) { v = split(pins, P, " ") for(n = 1; n <=v ; n++) { if ( (((P[n] SUBSEP "pinnumber") in PIN) && (PIN[P[n], "pinnumber"] == name)) \ || (((P[n] SUBSEP "pinlabel") in PIN) && (PIN[P[n], "pinlabel"] == name))) { PIN[P[n], "pinnumber"] = val PIN[P[n], "pin_name"] = name PIN[P[n], "pin_val"] = val return 0 } } return -1 } function subs_pinmap( v,n, PM, mv,mn,MAP,NAMES,VALS,name,val) { v = split(ATTR["pinmap"], PM, "[;|]") for(n = 1; n <= v; n++) { mv = split(PM[n], MAP, "=") if (mv != 2) error("invalid pinmap format: " PM[n] " is not a pinname=pin pair") name = MAP[1] val = MAP[2] if (name in NAMES) error("invalid pinmap format: pinname " name " is included multiple times") if (val in VALS) error("invalid pinmap format: pin " val " is referenced multiple times") NAMES[name]=1 VALS[val]=1 if (set_pin(name, val) != 0) error("invalid pinmap: pinname " name " is not found on pinnumber or pinlabel of the symbol") } } function summary_got_component(sym, refdes) { if ("devmap" in ATTR) subs_devmap() if ("pinmap" in ATTR) subs_pinmap() summary_out() }