@@ -109,6 +109,26 @@ lw_width(const lw_ctx_t *C, uint32_t nidx)
109109 return 1 ; /* default 1-bit */
110110}
111111
112+ /* ---- Source location pull from an AST node ----
113+ * Used at the rt_*_at callsites so newly created nets and
114+ * cells remember where in the user's source they came from.
115+ * Out-of-range or sentinel nidx yields zero, which downstream
116+ * code treats as "no provenance," same as the untagged path. */
117+
118+ static uint32_t
119+ lw_line (const lw_ctx_t * C , uint32_t nidx )
120+ {
121+ if (nidx == 0 || nidx >= C -> P -> n_node ) return 0 ;
122+ return C -> P -> nodes [nidx ].line ;
123+ }
124+
125+ static uint16_t
126+ lw_col (const lw_ctx_t * C , uint32_t nidx )
127+ {
128+ if (nidx == 0 || nidx >= C -> P -> n_node ) return 0 ;
129+ return (uint16_t )C -> P -> nodes [nidx ].col ;
130+ }
131+
112132/* ---- ceil(log2(n)) — address bits for n elements ---- */
113133
114134static uint32_t
@@ -240,7 +260,8 @@ lw_fnet(lw_ctx_t *C, uint32_t ast_id)
240260 }
241261
242262 /* Create new net */
243- ni = rt_anet (C -> M , nm , nlen , w , 0 , C -> radix );
263+ ni = rt_anet_at (C -> M , nm , nlen , w , 0 , C -> radix ,
264+ lw_line (C , ast_id ), lw_col (C , ast_id ));
244265 C -> nmap [ast_id ] = ni ;
245266 return ni ;
246267}
@@ -271,8 +292,10 @@ lw_expr(lw_ctx_t *C, uint32_t nidx)
271292 val = C -> cv [nidx ].val ;
272293 if (C -> cv [nidx ].width > 0 ) cw = C -> cv [nidx ].width ;
273294 }
274- onet = rt_anet (C -> M , "const" , 5 , cw , 0 , C -> radix );
275- ci = rt_acell (C -> M , RT_CONST , onet , NULL , 0 , cw );
295+ onet = rt_anet_at (C -> M , "const" , 5 , cw , 0 , C -> radix ,
296+ lw_line (C , nidx ), lw_col (C , nidx ));
297+ ci = rt_acell_at (C -> M , RT_CONST , onet , NULL , 0 , cw ,
298+ lw_line (C , nidx ), lw_col (C , nidx ));
276299 if (ci > 0 && ci < C -> M -> n_cell )
277300 C -> M -> cells [ci ].param = val ;
278301 return onet ;
@@ -329,9 +352,11 @@ lw_expr(lw_ctx_t *C, uint32_t nidx)
329352 ow = lw > rw ? lw : rw ;
330353 }
331354
332- onet = rt_anet (C -> M , "tmp" , 3 , ow , 0 , C -> radix );
355+ onet = rt_anet_at (C -> M , "tmp" , 3 , ow , 0 , C -> radix ,
356+ lw_line (C , nidx ), lw_col (C , nidx ));
333357 ins [0 ] = l ; ins [1 ] = r ;
334- rt_acell (C -> M , ct , onet , ins , 2 , ow );
358+ rt_acell_at (C -> M , ct , onet , ins , 2 , ow ,
359+ lw_line (C , nidx ), lw_col (C , nidx ));
335360 return onet ;
336361 }
337362
@@ -352,16 +377,20 @@ lw_expr(lw_ctx_t *C, uint32_t nidx)
352377 /* Bitwise NOT: same width as operand */
353378 uint32_t ow = operand < C -> M -> n_net ?
354379 C -> M -> nets [operand ].width : 1 ;
355- uint32_t onet = rt_anet (C -> M , "tmp" , 3 , ow , 0 , C -> radix );
380+ uint32_t onet = rt_anet_at (C -> M , "tmp" , 3 , ow , 0 , C -> radix ,
381+ lw_line (C , nidx ), lw_col (C , nidx ));
356382 uint32_t ins [1 ] = { operand };
357- rt_acell (C -> M , RT_NOT , onet , ins , 1 , ow );
383+ rt_acell_at (C -> M , RT_NOT , onet , ins , 1 , ow ,
384+ lw_line (C , nidx ), lw_col (C , nidx ));
358385 return onet ;
359386 }
360387 if (strcmp (op , "!" ) == 0 ) {
361388 /* Logical NOT: always 1-bit */
362- uint32_t onet = rt_anet (C -> M , "tmp" , 3 , 1 , 0 , C -> radix );
389+ uint32_t onet = rt_anet_at (C -> M , "tmp" , 3 , 1 , 0 , C -> radix ,
390+ lw_line (C , nidx ), lw_col (C , nidx ));
363391 uint32_t ins [1 ] = { operand };
364- rt_acell (C -> M , RT_NOT , onet , ins , 1 , 1 );
392+ rt_acell_at (C -> M , RT_NOT , onet , ins , 1 , 1 ,
393+ lw_line (C , nidx ), lw_col (C , nidx ));
365394 return onet ;
366395 }
367396 return operand ; /* +a is just a */
@@ -535,9 +564,11 @@ lw_expr(lw_ctx_t *C, uint32_t nidx)
535564 dw0 = d0 < C -> M -> n_net ? C -> M -> nets [d0 ].width : 1 ;
536565 ow = dw1 > dw0 ? dw1 : dw0 ;
537566
538- onet = rt_anet (C -> M , "tmp" , 3 , ow , 0 , C -> radix );
567+ onet = rt_anet_at (C -> M , "tmp" , 3 , ow , 0 , C -> radix ,
568+ lw_line (C , nidx ), lw_col (C , nidx ));
539569 ins [0 ] = sel ; ins [1 ] = d0 ; ins [2 ] = d1 ;
540- rt_acell (C -> M , RT_MUX , onet , ins , 3 , ow );
570+ rt_acell_at (C -> M , RT_MUX , onet , ins , 3 , ow ,
571+ lw_line (C , nidx ), lw_col (C , nidx ));
541572 return onet ;
542573 }
543574
@@ -1455,9 +1486,10 @@ lw_mod(lw_ctx_t *C, uint32_t mod_node)
14551486 }
14561487
14571488 if (name_n ) {
1458- uint32_t ni = rt_anet (C -> M ,
1489+ uint32_t ni = rt_anet_at (C -> M ,
14591490 lw_text (C , name_n ), lw_tlen (C , name_n ),
1460- w , dir , C -> radix );
1491+ w , dir , C -> radix ,
1492+ lw_line (C , c ), lw_col (C , c ));
14611493 C -> nmap [name_n ] = ni ;
14621494 }
14631495 break ;
0 commit comments