[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
Re: gEDA-user: Attribute Net (without pin assignment) - for Power and Port Symbols
On Sun, Apr 10, 2011 at 11:22:54PM +0200, Markus Traidl wrote:
> Actually I would like to use only the net attribute. There I could
> assign net=3V3 instead of net=3V3:1.
>
> I know that the ":1" is that the gnetlist tool knows that the 3V3 is
> connected to pin 1.
>
> But in case of a "One-Pin-Symbol" the gnetlist tool could assume that
> the only net should be assigned to the only pin.
This has been asked for several times and I don't see a reason why this should
not be allowed for single pin symbols and only for pin number 1.
The patches are attached - please test and report any potential breakage.
--
Krzysztof KoÅciuszkiewicz
"Simplicity is the ultimate sophistication" -- Leonardo da Vinci
From 336dbb62f859a19c5078504828c8298a11d47210 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Krzysztof=20Ko=C5=9Bciuszkiewicz?= <k.kosciuszkiewicz@xxxxxxxxx>
Date: Mon, 11 Apr 2011 23:03:12 +0200
Subject: [PATCH 1/3] gnetlist: refactor s_netattrib_net_search
Replace two loops with one by using o_attrib_search_object_attribs_by_name.
Factor out inside of the loop to a separate function,
netname_if_matching_wanted_pin.
---
gnetlist/src/s_netattrib.c | 94 ++++++++++++++++----------------------------
1 files changed, 34 insertions(+), 60 deletions(-)
diff --git a/gnetlist/src/s_netattrib.c b/gnetlist/src/s_netattrib.c
index 957735c..c8052f9 100644
--- a/gnetlist/src/s_netattrib.c
+++ b/gnetlist/src/s_netattrib.c
@@ -213,84 +213,58 @@ s_netattrib_handle (TOPLEVEL * pr_current, OBJECT * o_current,
}
}
+static char* netname_if_matching_wanted_pin (OBJECT *o_current,
+ char *net_attr,
+ const char *wanted_pin)
+{
+ char *char_ptr = strchr (net_attr, ':');
+
+ if (char_ptr != NULL) {
+ /* found a colon separating netname and list of pins */
+ char *net_name = s_netattrib_extract_netname (net_attr);
+ char *start_of_pinlist = char_ptr + 1;
+ char *current_pin = strtok (start_of_pinlist, DELIMITERS);
+
+ while (current_pin) {
+ if (strcmp (current_pin, wanted_pin) == 0)
+ return net_name;
+ current_pin = strtok (NULL, DELIMITERS);
+ }
+
+ g_free (net_name);
+ return NULL;
+ } else {
+ fprintf (stderr, "Got an invalid net= attrib [net=%s]\n"
+ "Missing : in net= attrib\n", net_attr);
+ return NULL;
+ }
+}
+
char *s_netattrib_net_search (OBJECT * o_current, char *wanted_pin)
{
char *value = NULL;
- char *char_ptr = NULL;
char *net_name = NULL;
- char *current_pin = NULL;
- char *start_of_pinlist = NULL;
- char *return_value = NULL;
int counter;
if (o_current == NULL ||
o_current->complex == NULL)
return NULL;
- /* for now just look inside the component */
- for (counter = 0; ;) {
- value = o_attrib_search_inherited_attribs_by_name (o_current,
- "net", counter);
+ for (counter = 0; ; ++counter) {
+ value = o_attrib_search_object_attribs_by_name (o_current,
+ "net", counter);
if (value == NULL)
break;
- counter++;
-
- char_ptr = strchr (value, ':');
- if (char_ptr == NULL) {
- fprintf (stderr, "Got an invalid net= attrib [net=%s]\n"
- "Missing : in net= attrib\n", value);
- g_free (value);
- return NULL;
- }
-
- net_name = s_netattrib_extract_netname (value);
-
- start_of_pinlist = char_ptr + 1;
- current_pin = strtok (start_of_pinlist, DELIMITERS);
- while (current_pin && !return_value) {
- if (strcmp (current_pin, wanted_pin) == 0) {
- return_value = net_name;
- }
- current_pin = strtok (NULL, DELIMITERS);
- }
+ net_name = netname_if_matching_wanted_pin (o_current, value, wanted_pin);
g_free (value);
- }
-
- /* now look outside the component */
- for (counter = 0; ;) {
- value = o_attrib_search_attached_attribs_by_name (o_current,
- "net", counter);
- if (value == NULL)
- break;
-
- counter++;
- char_ptr = strchr (value, ':');
- if (char_ptr == NULL) {
- fprintf (stderr, "Got an invalid net= attrib [net=%s]\n"
- "Missing : in net= attrib\n", value);
- g_free (value);
- return NULL;
- }
-
- net_name = s_netattrib_extract_netname (value);
-
- start_of_pinlist = char_ptr + 1;
- current_pin = strtok (start_of_pinlist, DELIMITERS);
- while (current_pin) {
- if (strcmp (current_pin, wanted_pin) == 0) {
- g_free (return_value);
- return net_name;
- }
- current_pin = strtok (NULL, DELIMITERS);
- }
-
- g_free (value);
+ if (net_name != NULL)
+ return net_name;
}
- return return_value;
+ return NULL;
}
char *s_netattrib_return_netname(TOPLEVEL * pr_current, OBJECT * o_current,
--
1.7.4.1
From 68eeaa6103d851371b1264f24eab10a126fa97ad Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Krzysztof=20Ko=C5=9Bciuszkiewicz?= <k.kosciuszkiewicz@xxxxxxxxx>
Date: Mon, 11 Apr 2011 23:05:12 +0200
Subject: [PATCH 2/3] gnetlist: make pin number optional in net attribute
The colon and pin number can be omitted only if:
* The symbol has exactly one pin
* The pin number is 1
This change allows the user to omit ":1" from single pin symbols,
such as power connectors with editable net name.
---
gnetlist/src/s_netattrib.c | 23 +++++++++++++++++++++++
1 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/gnetlist/src/s_netattrib.c b/gnetlist/src/s_netattrib.c
index c8052f9..4c44de5 100644
--- a/gnetlist/src/s_netattrib.c
+++ b/gnetlist/src/s_netattrib.c
@@ -213,6 +213,24 @@ s_netattrib_handle (TOPLEVEL * pr_current, OBJECT * o_current,
}
}
+static int count_object_pins (OBJECT *o_current)
+{
+ GList *l;
+ int count = 0;
+
+ g_return_val_if_fail (o_current, 0);
+ g_return_val_if_fail (o_current->type == OBJ_COMPLEX, 0);
+ g_return_val_if_fail (o_current->complex, 0);
+
+ for (l = o_current->complex->prim_objs; l; l = g_list_next (l)) {
+ OBJECT *o = (OBJECT*) l->data;
+ if (o && o->type == OBJ_PIN)
+ count += 1;
+ }
+
+ return count;
+}
+
static char* netname_if_matching_wanted_pin (OBJECT *o_current,
char *net_attr,
const char *wanted_pin)
@@ -233,6 +251,11 @@ static char* netname_if_matching_wanted_pin (OBJECT *o_current,
g_free (net_name);
return NULL;
+ } else if (strcmp (wanted_pin, "1") == 0
+ && count_object_pins (o_current) == 1) {
+ /* no colon, but looking for pin #1 in symbol with only one pin */
+ /* this matches the case for single net power symbols */
+ return g_strdup (net_attr);
} else {
fprintf (stderr, "Got an invalid net= attrib [net=%s]\n"
"Missing : in net= attrib\n", net_attr);
--
1.7.4.1
From de28cf1a6e414c94ac7a90bd9635fef88cc1a08e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Krzysztof=20Ko=C5=9Bciuszkiewicz?= <k.kosciuszkiewicz@xxxxxxxxx>
Date: Mon, 11 Apr 2011 23:42:05 +0200
Subject: [PATCH 3/3] gnetlist: netattrib testcase covers optional pin number
---
gnetlist/tests/netattrib.geda | 2 +-
gnetlist/tests/netattrib.sch | 25 +++++++++++++++----------
2 files changed, 16 insertions(+), 11 deletions(-)
diff --git a/gnetlist/tests/netattrib.geda b/gnetlist/tests/netattrib.geda
index 5910ebd..229a970 100644
--- a/gnetlist/tests/netattrib.geda
+++ b/gnetlist/tests/netattrib.geda
@@ -22,7 +22,7 @@ END renamed-nets
START nets
-unnamed_net1 : U300 2
+power : U300 2
netattrib : U200 2, U100 5
GND : U300 7, U200 7, U100 7
Vcc : U300 14, U200 14, U100 14
diff --git a/gnetlist/tests/netattrib.sch b/gnetlist/tests/netattrib.sch
index 2c56e7b..658c256 100644
--- a/gnetlist/tests/netattrib.sch
+++ b/gnetlist/tests/netattrib.sch
@@ -1,46 +1,51 @@
-v 20030901
+v 20110116 2
C 38100 60100 1 0 0 7400-1.sym
{
-T 38400 61000 5 10 1 1 0 0
+T 38400 61000 5 10 1 1 0 0 1
refdes=U100
-T 39000 60200 5 10 1 1 0 0
+T 39000 60200 5 10 1 1 0 0 1
net=netattrib:5
}
C 41000 58800 1 0 0 7404-1.sym
{
-T 41300 59700 5 10 1 1 0 0
+T 41300 59700 5 10 1 1 0 0 1
refdes=U200
}
N 40000 59300 41000 59300 4
{
-T 40100 59400 5 10 1 1 0 0
+T 40100 59400 5 10 1 1 0 0 1
netname=two
}
N 40000 59300 40000 61300 4
N 40000 61300 41200 61300 4
{
-T 40200 61400 5 10 1 1 0 0
+T 40200 61400 5 10 1 1 0 0 1
netname=one
}
C 41200 60800 1 0 0 7404-1.sym
{
-T 41500 61700 5 10 1 1 0 0
+T 41500 61700 5 10 1 1 0 0 1
refdes=U300
}
N 39400 60600 40000 60600 4
N 42100 59300 43300 59300 4
{
-T 42500 59400 5 10 1 1 0 0
+T 42500 59400 5 10 1 1 0 0 1
netname=netattrib
}
N 42300 61300 43000 61300 4
N 38400 58600 39100 58600 4
{
-T 38500 58700 5 10 1 1 0 0
+T 38500 58700 5 10 1 1 0 0 1
netname=two
}
C 39100 58600 1 0 0 fuse-1.sym
{
-T 39300 58800 5 10 1 1 0 0
+T 39300 58800 5 10 1 1 0 0 1
refdes=F1
}
+C 42800 61300 1 0 0 generic-power.sym
+{
+T 43000 61550 5 10 1 1 0 3 1
+net=power
+}
--
1.7.4.1
_______________________________________________
geda-user mailing list
geda-user@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user