static void netlist_helper_nl_wire_traverse (Wire *wire, GSList **lst) { GSList *nodes; g_return_if_fail (wire != NULL); g_return_if_fail (IS_WIRE (wire)); if (wire_is_visited (wire)) return; wire_set_visited (wire, TRUE); for (nodes = wire_get_nodes (wire); nodes; nodes = nodes->next) { GSList *pins; Part *part; Node *node = nodes->data; for (pins=node->pins; pins; pins=pins->next) { char *template, *tmp; char **template_split; part = PART (((Pin *)pins->data)->part); tmp = part_get_property (part, "template"); if (!tmp) continue;
static void write_xml_wire (Wire *wire, parseXmlContext *ctxt) { xmlNodePtr node_wire; gchar *str; Coords start_pos, end_pos; g_return_if_fail (wire != NULL); g_return_if_fail (IS_WIRE (wire)); // Create a node for the wire. node_wire = xmlNewChild (ctxt->node_wires, ctxt->ns, BAD_CAST "wire", NULL); if (!node_wire) { g_warning ("Failed during save of wire.\n"); return; } wire_get_start_pos (wire, &start_pos); wire_get_end_pos (wire, &end_pos); Node *node; Coords last, current, tmp; GSList *iter, *copy; copy = g_slist_sort (g_slist_copy (wire_get_nodes (wire)), cmp_nodes); current = last = start_pos; for (iter = copy; iter; iter = iter->next) { node = iter->data; if (node==NULL) { g_warning ("Node of wire did not exist [%p].", node); continue; } tmp = node->key; if (coords_equal(&tmp, &start_pos)) continue; if (coords_equal(&tmp, &end_pos)) continue; last = current; current = tmp; str = g_strdup_printf ("(%g %g)(%g %g)", last.x, last.y, current.x, current.y); xmlNewChild (node_wire, ctxt->ns, BAD_CAST "points", BAD_CAST str); g_free (str); } last = current; current = end_pos; str = g_strdup_printf ("(%g %g)(%g %g)", last.x, last.y, current.x, current.y); xmlNewChild (node_wire, ctxt->ns, BAD_CAST "points", BAD_CAST str); g_free (str); g_slist_free (copy); }
int node_store_remove_wire (NodeStore *store, Wire *wire) { GSList *list; SheetPos lookup_key, pos, length; g_return_val_if_fail (store != NULL, FALSE); g_return_val_if_fail (IS_NODE_STORE (store), FALSE); g_return_val_if_fail (wire != NULL, FALSE); g_return_val_if_fail (IS_WIRE (wire), FALSE); if (item_data_get_store (ITEM_DATA (wire)) == NULL) { g_warning ("Trying to remove non-stored wire."); return FALSE; } wire_get_pos_and_length (wire, &pos, &length); store->wires = g_list_remove (store->wires, wire); store->items = g_list_remove (store->items, wire); // If the nodes that this wire passes through will be // empty when the wire is removed, remove the node as well. // We must work on a copy of the nodes list, since it // changes as we remove nodes. list = g_slist_copy (wire_get_nodes (wire)); for (; list; list = list->next) { Node *node = list->data; lookup_key = node->key; node_remove_wire (node, wire); wire_remove_node (wire, node); if (node_is_empty (node)) g_hash_table_remove (store->nodes, &lookup_key); } g_slist_free (list); return TRUE; }
static void wire_traverse (Wire *wire) { GSList *iter; g_return_if_fail (wire != NULL); g_return_if_fail (IS_WIRE (wire)); if (wire_is_visited (wire)) return; wire_set_visited (wire, TRUE); g_signal_emit_by_name (wire, "highlight"); for (iter = wire_get_nodes (wire); iter; iter = iter->next) { Node *node = iter->data; node_traverse (node); } }
/** * removes/unregisters a wire from the nodestore * this does _not_ free the wire itself! */ gboolean node_store_remove_wire (NodeStore *store, Wire *wire) { GSList *copy, *iter; Coords lookup_key; g_return_val_if_fail (store, FALSE); g_return_val_if_fail (IS_NODE_STORE (store), FALSE); g_return_val_if_fail (wire, FALSE); g_return_val_if_fail (IS_WIRE (wire), FALSE); if (item_data_get_store (ITEM_DATA (wire)) == NULL) { g_warning ("Trying to remove not-stored wire %p.", wire); return FALSE; } store->wires = g_list_remove (store->wires, wire); store->items = g_list_remove (store->items, wire); // If the nodes that this wire passes through will be // empty when the wire is removed, remove the node as well. // FIXME if done properly, a list copy is _not_ necessary copy = g_slist_copy (wire_get_nodes (wire)); for (iter = copy; iter; iter = iter->next) { Node *node = iter->data; lookup_key = node->key; node_remove_wire (node, wire); wire_remove_node (wire, node); if (node_is_empty (node)) g_hash_table_remove (store->nodes, &lookup_key); } g_slist_free (copy); return TRUE; }
static void wire_traverse (Wire *wire) { GSList *nodes; g_return_if_fail (wire != NULL); g_return_if_fail (IS_WIRE (wire)); if (wire_is_visited (wire)) return; wire_set_visited (wire, TRUE); g_signal_emit_by_name (wire, "highlight"); for (nodes = wire_get_nodes (wire); nodes; nodes = nodes->next) { Node *node = nodes->data; node_traverse (node); } g_slist_free_full (nodes, g_object_unref); }
int node_store_add_wire (NodeStore *store, Wire *wire) { gdouble x1, y1, x2, y2; GSList *ip_list, *list; IntersectionPoint *ipoint; Node *node; SheetPos pos, length; g_return_val_if_fail (store != NULL, FALSE); g_return_val_if_fail (IS_NODE_STORE (store), FALSE); g_return_val_if_fail (wire != NULL, FALSE); g_return_val_if_fail (IS_WIRE (wire), FALSE); wire_get_pos_and_length (wire, &pos, &length); x1 = pos.x; y1 = pos.y; x2 = x1 + length.x; y2 = y1 + length.y; // Check for intersection with other wires. ip_list = wires_intersect (store, x1, y1, x2, y2); for (list = ip_list; list; list = list->next) { ipoint = list->data; if (IS_EQ (x1, x2) && ((ipoint->pos.y == y1) || (ipoint->pos.y == y2))) { SheetPos w_pos, w_length; gboolean can_join; GSList *nodes; wire_get_pos_and_length (ipoint->wire, &w_pos, &w_length); gdouble _x1, _x2, _y1, _y2; _x1 = w_pos.x; _y1 = w_pos.y; _x2 = _x1 + w_length.x; _y2 = _y1 + w_length.y; can_join = TRUE; nodes = wire_get_nodes (wire); for (; nodes; nodes = nodes->next) { SheetPos p1; Node *node = (Node *)nodes->data; p1.x = _x1; p1.y = _y1; if ((fabs (node->key.x - p1.x) < 1e-3) && (fabs (node->key.y - p1.y) < 1e-3)){ can_join = FALSE; break; } p1.x = _x2; p1.y = _y2; if ((fabs (node->key.x - p1.x) < 1e-3) && (fabs (node->key.y - p1.y) < 1e-3)){ can_join = FALSE; break; } } if (IS_EQ(_x1, _x2) && can_join) { if (w_pos.x < pos.x) pos.x = w_pos.x; if (w_pos.y < pos.y) pos.y = w_pos.y; length.x += w_length.x; length.y += w_length.y; // Update the new size and pos of the wire item_data_unregister (ITEM_DATA (ipoint->wire)); wire_set_length (ipoint->wire, &length); item_data_set_pos (ITEM_DATA (ipoint->wire), &pos); wire_update_bbox (ipoint->wire); item_data_register (ITEM_DATA (ipoint->wire)); // Done!, return -1 so wire is deleted return -1; } } else if (IS_EQ (y1, y2) && ((ipoint->pos.x == x1) || (ipoint->pos.x == x2))) { SheetPos w_pos, w_length; gboolean can_join; GSList *nodes; wire_get_pos_and_length (ipoint->wire, &w_pos, &w_length); gdouble _x1, _x2, _y1, _y2; _x1 = w_pos.x; _y1 = w_pos.y; _x2 = _x1 + w_length.x; _y2 = _y1 + w_length.y; can_join = TRUE; nodes = wire_get_nodes (wire); for (; nodes; nodes = nodes->next) { SheetPos p; Node *node = (Node *)nodes->data; p.x = _x1; p.y = _y1; if ((fabs (node->key.x - p.x) < 1e-3) && (fabs (node->key.y - p.y) < 1e-3)){ can_join = FALSE; break; } p.x = _x2; p.y = _y2; if ((fabs (node->key.x - p.x) < 1e-3) && (fabs (node->key.y - p.y) < 1e-3)){ can_join = FALSE; break; } } if (IS_EQ(_y1, _y2) && can_join) { if (w_pos.x < pos.x) pos.x = w_pos.x; if (w_pos.y < pos.y) pos.y = w_pos.y; length.x += w_length.x; length.y += w_length.y; // Update the new size and pos of the wire item_data_unregister (ITEM_DATA (ipoint->wire)); wire_set_length (ipoint->wire, &length); item_data_set_pos (ITEM_DATA (ipoint->wire), &pos); wire_update_bbox (ipoint->wire); item_data_register (ITEM_DATA (ipoint->wire)); // Done!, return -1 so wire si deleted return -1; } } node = node_store_get_or_create_node (store, ipoint->pos); // Add the wire, and also the wire that is intersected. node_add_wire (node, wire); node_add_wire (node, ipoint->wire); wire_add_node (wire, node); wire_add_node (ipoint->wire, node); NG_DEBUG ("Add wire to wire.\n"); g_free (ipoint); } g_slist_free (ip_list); // Check for intersection with parts (pins). ip_list = wire_intersect_parts (store, wire); for (list = ip_list; list; list = list->next) { node = list->data; // Add the wire to the node (pin) that it intersected. node_add_wire (node, wire); wire_add_node (wire, node); NG_DEBUG ("Add wire to pin.\n"); } g_slist_free (ip_list); g_object_set (G_OBJECT (wire), "store", store, NULL); store->wires = g_list_prepend (store->wires, wire); store->items = g_list_prepend (store->items, wire); return TRUE; }