Index: src_plugins/io_pads/delay_postproc.c =================================================================== --- src_plugins/io_pads/delay_postproc.c (revision 34589) +++ src_plugins/io_pads/delay_postproc.c (revision 34590) @@ -28,8 +28,47 @@ */ #include "delay_postproc.h" +#include "obj_pstk_inlines.h" +#include "netlist.h" -void pcb_dlcr_post_poly_thermal_netname(pcb_board_t *pcb, pcb_poly_t *poly, const char *netname, pcb_thermal_t *t) +typedef struct { + pcb_board_t *pcb; + pcb_poly_t *poly; + const char *netname; + pcb_thermal_t t; + const char *(*obj_netname)(void *uctx, pcb_any_obj_t *obj); + void *uctx; +} ppr_t; + +void pcb_dlcr_post_poly_thermal_obj(pcb_board_t *pcb, pcb_poly_t *poly, pcb_any_obj_t *obj, pcb_thermal_t t) { + printf("THERMAL!\n"); +} +static rnd_r_dir_t ppr_poly_therm(const rnd_box_t *b, void *cl) +{ + ppr_t *ppr = cl; + pcb_any_obj_t *o = (pcb_any_obj_t *)b; + const char *vnn = ppr->obj_netname(ppr->uctx, o); + + if ((vnn != NULL) && (strcmp(vnn, ppr->netname) == 0)) + pcb_dlcr_post_poly_thermal_obj(ppr->pcb, ppr->poly, o, ppr->t); + + return RND_R_DIR_FOUND_CONTINUE; } + + +void pcb_dlcr_post_poly_thermal_netname(pcb_board_t *pcb, pcb_poly_t *poly, const char *netname, pcb_thermal_t t, const char *(*obj_netname)(void *uctx, pcb_any_obj_t *obj), void *uctx) +{ + ppr_t ppr; + + ppr.pcb = pcb; + ppr.poly = poly; + ppr.t = t; + ppr.obj_netname = obj_netname; + ppr.uctx = uctx; + + rnd_r_search(poly->parent.layer->line_tree, &poly->BoundingBox, NULL, ppr_poly_therm, &ppr, NULL); + rnd_r_search(poly->parent.layer->arc_tree, &poly->BoundingBox, NULL, ppr_poly_therm, &ppr, NULL); + rnd_r_search(pcb->Data->padstack_tree, &poly->BoundingBox, NULL, ppr_poly_therm, &ppr, NULL); +} Index: src_plugins/io_pads/delay_postproc.h =================================================================== --- src_plugins/io_pads/delay_postproc.h (revision 34589) +++ src_plugins/io_pads/delay_postproc.h (revision 34590) @@ -1,5 +1,8 @@ #include "thermal.h" /* Set thermal on all terminals that are in the same net and within the poly */ -void pcb_dlcr_post_poly_thermal_netname(pcb_board_t *pcb, pcb_poly_t *poly, const char *netname, pcb_thermal_t *t); +void pcb_dlcr_post_poly_thermal_netname(pcb_board_t *pcb, pcb_poly_t *poly, const char *netname, pcb_thermal_t t, const char *(*obj_netname)(void *uctx, pcb_any_obj_t *obj), void *uctx); + + + Index: src_plugins/io_pads/read.c =================================================================== --- src_plugins/io_pads/read.c (revision 34589) +++ src_plugins/io_pads/read.c (revision 34590) @@ -46,6 +46,7 @@ #include "delay_create.h" #include "delay_clearance.h" +#include "delay_postproc.h" #include "read.h" /* Parser return value convention: @@ -73,6 +74,7 @@ pcb_dlcr_t dlcr; pcb_dlcr_layer_t *layer; htsp_t parts; /* translate part to partdecal and swaps; key=partname value=(pads_read_part_t *) */ + const char *signal_netname; /* netname of the signal currently being read */ /* location */ const char *fn; @@ -295,16 +297,30 @@ return -1; } +static const char *postproc_thermal_lookup(htpp_t *ht, pcb_any_obj_t *obj) +{ + return htpp_get(ht, obj); +} + static void postproc_thermal(pads_read_ctx_t *rctx) { long n; + htpp_t obj2net; + htpp_init(&obj2net, ptrhash, ptrkeyeq); + + for(n = 0; n < rctx->dlcr.netname_objs.used; n += 2) + htpp_insert(&obj2net, rctx->dlcr.netname_objs.array[n], rctx->dlcr.netname_objs.array[n+1]); + + for(n = 0; n < rctx->dlcr.netname_objs.used; n += 2) { pcb_any_obj_t *o = rctx->dlcr.netname_objs.array[n]; const char *netname = rctx->dlcr.netname_objs.array[n+1]; if (o->type == PCB_OBJ_POLY) - pcb_dlcr_post_poly_thermal_netname(rctx->pcb, o, netname, PCB_THERMAL_ROUND | PCB_THERMAL_DIAGONAL | PCB_THERMAL_ON); + pcb_dlcr_post_poly_thermal_netname(rctx->pcb, o, netname, PCB_THERMAL_ROUND | PCB_THERMAL_DIAGONAL | PCB_THERMAL_ON, NULL, NULL); } + + htpp_uninit(&obj2net); } int io_pads_parse_pcb(pcb_plug_io_t *ctx, pcb_board_t *pcb, const char *filename, rnd_conf_role_t settings_dest) Index: src_plugins/io_pads/read_high.c =================================================================== --- src_plugins/io_pads/read_high.c (revision 34589) +++ src_plugins/io_pads/read_high.c (revision 34590) @@ -1140,7 +1140,7 @@ /* in this case level is the via's target level and our trace segment is really on the same level as the previous */ level = spc->lastlev; - via = pcb_dlcr_via_new(&rctx->dlcr, x, y, 0, -1, vianame, NULL); + via = pcb_dlcr_via_new(&rctx->dlcr, x, y, 0, -1, vianame, rctx->signal_netname); if (via != NULL) via->loc_line = loc_line; } @@ -1229,7 +1229,11 @@ if ((res = pads_read_word(rctx, netname, sizeof(netname), 0)) <= 0) return res; rnd_trace("signal: netname=%s\n", netname); - return pads_parse_list_sect(rctx, pads_parse_net); + rctx->signal_netname = netname; + res = pads_parse_list_sect(rctx, pads_parse_net); + rctx->signal_netname = NULL; + + return res; } typedef enum {