static int prefer_vert(hwloc_topology_t topology, int logical, hwloc_obj_t level, void *output, unsigned depth, unsigned x, unsigned y, unsigned separator) { float horiz_ratio, vert_ratio; unsigned textwidth = 0; unsigned mywidth = 0, myheight = 0; unsigned totwidth, *retwidth = &totwidth, totheight, *retheight = &totheight; RECURSE_HORIZ(level, &null_draw_methods, separator, 0); horiz_ratio = (float)totwidth / totheight; RECURSE_VERT(level, &null_draw_methods, separator, 0); vert_ratio = (float)totwidth / totheight; return force_orient[level->type] == LSTOPO_ORIENT_VERT || (force_orient[level->type] != LSTOPO_ORIENT_HORIZ && prefer_ratio(vert_ratio, horiz_ratio)); }
static void bridge_draw(struct lstopo_output *loutput, struct draw_methods *methods, hwloc_obj_t level, unsigned depth, unsigned x, unsigned *retwidth, unsigned y, unsigned *retheight) { hwloc_topology_t topology = loutput->topology; int logical = loutput->logical; unsigned gridsize = loutput->gridsize; unsigned fontsize = loutput->fontsize; unsigned textwidth = 0; unsigned myheight = 0; /* Room for square, left link and speed */ unsigned speedwidth = fontsize ? fontsize + gridsize : 0; unsigned mywidth = 2*gridsize + gridsize + speedwidth; unsigned totwidth, totheight; struct style style; unsigned center; DYNA_CHECK(); RECURSE_VERT(level, &null_draw_methods, gridsize, 0); /* Square and left link */ lstopo_set_object_color(methods, topology, level, 0, &style); methods->box(loutput, style.bg.r, style.bg.g, style.bg.b, depth, x, gridsize, y + PCI_HEIGHT/2 - gridsize/2, gridsize); methods->line(loutput, 0, 0, 0, depth, x + gridsize, y + PCI_HEIGHT/2, x + 2*gridsize, y + PCI_HEIGHT/2); if (level->io_arity > 0) { unsigned bottom = 0, top = 0; RECURSE_BEGIN(level, 0); RECURSE_FOR(level) RECURSE_CALL_FUN(methods); /* Line to PCI device */ center = y + totheight + PCI_HEIGHT / 2; if (!top) top = center; bottom = center; methods->line(loutput, 0, 0, 0, depth, x + 2*gridsize, center, x + 2*gridsize + gridsize + speedwidth, center); /* Negotiated link speed */ if (fontsize) { float speed = 0.; if (child->type == HWLOC_OBJ_PCI_DEVICE) speed = child->attr->pcidev.linkspeed; if (child->type == HWLOC_OBJ_BRIDGE && child->attr->bridge.upstream_type == HWLOC_OBJ_BRIDGE_PCI) speed = child->attr->bridge.upstream.pci.linkspeed; if (speed != 0.) { char text[4]; if (speed >= 10.) snprintf(text, sizeof(text), "%.0f", child->attr->pcidev.linkspeed); else snprintf(text, sizeof(text), "%0.1f", child->attr->pcidev.linkspeed); methods->text(loutput, style.t2.r, style.t2.g, style.t2.b, fontsize, depth-1, x + 2*gridsize + gridsize, y + totheight, text); } } RECURSE_END_VERT(gridsize, 0); /* Vertical line */ methods->line(loutput, 0, 0, 0, depth, x + 2*gridsize, top, x + 2*gridsize, bottom); } else RECURSE_VERT(level, methods, gridsize, 0); /* Empty bridges still need some room */ if (*retheight < PCI_HEIGHT) *retheight = PCI_HEIGHT; DYNA_SAVE(); }