Index: read.c =================================================================== --- read.c (revision 38223) +++ read.c (revision 38224) @@ -2446,7 +2446,19 @@ return iolht_error(nval, "netlist patch attrib value must be a non-empty string (change_attrib)\n"); pcb_ratspatch_append(pcb, RATP_CHANGE_NET_ATTRIB, nnet->data.text.value, nkey->data.text.value, nval->data.text.value, 0); } + else if ((strcmp(np->name, "comp_add") == 0) || (strcmp(np->name, "comp_del") == 0)) { + int add = np->name[5] == 'a'; + if (rctx->rdver < 9) + iolht_warn(rctx, np, -1, "Lihata board below v9 should not have comp_add in the netlist patch\n"); + + nnet = lht_dom_hash_get(np, "comp"); + if ((nnet == NULL) || (nnet->type != LHT_TEXT) || (*nnet->data.text.value == '\0')) + return iolht_error(nnet, "netlist patch comp must be a non-empty text in %s\n", np->name); + + pcb_ratspatch_append(pcb, add ? RATP_COMP_ADD : RATP_COMP_DEL, nnet->data.text.value, NULL, NULL, 0); + } + } return 0; } Index: write.c =================================================================== --- write.c (revision 38223) +++ write.c (revision 38224) @@ -1669,6 +1669,27 @@ lht_dom_hash_put(n, build_text("val", val)); lht_dom_list_append(ctx->patch, n); break; + + case PCB_RPE_COMP_ADD: + if (wrver < 9) { + pcb_io_incompat_save(NULL, NULL, "board", "Netlist patch: can not save comp add (change lost from back annotation)\n", "Save in lihata v9"); + break; + } + n = lht_dom_node_alloc(LHT_HASH, "comp_add"); + lht_dom_hash_put(n, build_text("comp", netn)); + lht_dom_list_append(ctx->patch, n); + break; + + case PCB_RPE_COMP_DEL: + if (wrver < 9) { + pcb_io_incompat_save(NULL, NULL, "board", "Netlist patch: can not save comp del (change lost from back annotation)\n", "Save in lihata v9"); + break; + } + n = lht_dom_node_alloc(LHT_HASH, "comp_del"); + lht_dom_hash_put(n, build_text("comp", netn)); + lht_dom_list_append(ctx->patch, n); + break; + } }