17 #define HWA_E(...) _HWA_E_2(__COUNTER__,__VA_ARGS__ [__FILE__:__LINE__])
18 #define _HWA_E_2(...) _HWA_E_3(__VA_ARGS__)
19 #define _HWA_E_3(num,...) \
21 extern void __attribute__((error(#__VA_ARGS__))) hwa_##num(void); \
25 extern uint8_t hw_foo();
37 #define hw_asm(...) __asm__ __volatile__(__VA_ARGS__)
40 #define hwa_begin_ , _hwa_begin_
41 #define hwa_begin_reset , _hwa_begin_reset
51 #define _hwa_begin_(g,...) HW_B(_hwa_begin_,g)(g,__VA_ARGS__)
52 #define _hwa_begin_0(g,...) HW_E(HW_EM_AI(g))
53 #define _hwa_begin_1(...) \
54 _hwa_check_optimizations(0); \
55 hwa_t hwa_st ; hwa_t *hwa = &hwa_st ; \
56 _hwa_setup_context(hwa) ; \
57 uint8_t hwa_xcommit = 0
70 #define _hwa_begin_reset(r,g,...) HW_B(_hwa_begin_reset_,g)(g,__VA_ARGS__)
71 #define _hwa_begin_reset_0(r,g,...) HW_E(HW_EM_AI(g))
72 #define _hwa_begin_reset_1(...) \
73 _hwa_check_optimizations(0); \
74 hwa_t hwa_st ; hwa_t *hwa = &hwa_st ; \
75 _hwa_setup_context(hwa) ; \
76 _hwa_init_context(hwa) ; \
78 uint8_t hwa_xcommit = 0
92 #define _hwa_commit_(...) \
94 uint8_t foo __attribute__((unused)) = hwa_xcommit ; \
96 _hwa_commit_context(hwa); \
99 #define hwa_commit_ , _hwa_commit_
110 #define _hwa_nocommit_(...) \
113 _hwa_commit_context(hwa); \
116 #define hwa_nocommit_ , _hwa_nocommit_
128 #define HW_FC(...) _HW_FC(__VA_ARGS__)
129 #define _HW_FC(f,c,...) f##c(__VA_ARGS__,,)
140 #define _hw_read(o,r) HW_FC(_hw_read_,HW_X((o,r)),)
142 #define _hw_read_(o,...) HW_E(HW_A0(__VA_ARGS__)) // Error message
151 #define _hw_atomic_read(o,r) HW_FC(_hw_atomic_read_,HW_X((o,r)),)
154 #define hw_uint_t__r8 uint8_t
155 #define hw_uint_t__r16 uint16_t
156 #define hw_uint_t__r32 uint32_t
168 #define _hw_write(o,r,v) HW_FC(_hw_write_,HW_X((o,r)),v,)
170 #define _hw_write_(o,...) HW_E(HW_A0(__VA_ARGS__)) // Error message
181 #define _hwa_write(o,r,v) HW_FC(_hwa_write_,HW_X((o,r)),v,)
183 #define _hwa_write_(o,...) HW_E(HW_A0(__VA_ARGS__)) // Error message
189 #define hw_read__mem8 , _hw_read_mem8
190 #define _hw_read_mem8(o,a,...) *a
192 #define hw_read__mem16 , _hw_read_mem16
193 #define _hw_read_mem16(o,a,...) *a
195 #define hw_write__mem8 , _hw_write_mem8
196 #define _hw_write_mem8(o,a,v,...) *a = (v)
198 #define hw_write__mem16 , _hw_write_mem16
199 #define _hw_write_mem16(o,a,v,...) *a = (v)
204 #define hw_read__m11 , _hw_read__m11
205 #define _hw_read__m11(n,o,r,c,a,wm,fm,bn,bp,...) _hw_read_##c(a,bn,bp)
207 #define hw_readnp__m11 , _hw_readnp__m11
208 #define _hw_readnp__m11(n,o,r,c,a,wm,fm,bn,bp,_n,_p,...) _hw_read_##c(a,_n,_p)
210 #define hwa_write__m11 , _hwa_write__m11
212 #define _hwa_write__m11(n,o,r,c,a,wm,fm,bn,bp,v,...) \
213 _hwa_write##c(&hwa->o.r,wm,fm,((1ULL<<bn)-1)<<bp,((unsigned long long)(v))<<bp)
215 #define hw_write__m11 , _hw_write__m11
217 #define _hw_write__m11(n,o,r,c,a,wm,fm,bn,bp,v,...) \
218 _hw_write_##c(a,wm,fm,bn,bp,v)
220 #define hw_toggle__m11 , _hw_toggle__m11
222 #define _hw_toggle__m11(n,o,r,c,a,wm,fm,bn,bp,...) \
223 _hw_write_##c(a,wm,fm,bn,bp,((1UL<<bn)-1)&(((1UL<<bn)-1)^_hw_read_##c(a,bn,bp)))
225 #define _hw_write__m12(n,o,r,c,a,wm,fm,bn1,bp1,vp1,bn2,bp2,vp2,v,...) \
227 hw_uint_t_##c val = v ; \
228 _hw_write##c( a, wm, fm, \
229 (((1ULL<<bn1)-1)<<bp1) | (((1ULL<<bn2)-1)<<bp2), \
230 (((val>>vp1)&((1<<bn1)-1))<<bp1) | (((val>>bp2)&((1<<bn2)-1))<<bp2)); \
234 #define hwa_write__m22 , _hwa_write__m22
236 #define _hwa_write__m22( n, o, \
237 r1,c1,a1,wm1,fm1,bn1,bp1,vp1, \
238 r2,c2,a2,wm2,fm2,bn2,bp2,vp2, v, ... ) \
240 hw_uint_t_##c1 val = (v); \
241 _hwa_write_##c1(&hwa->o.r1, wm1,fm1, bn1,bp1, (val>>(vp1))&((1ULL<<bn1)-1)); \
242 _hwa_write_##c2(&hwa->o.r2, wm2,fm2, bn2,bp2, (val>>(vp2))&((1ULL<<bn2)-1)); \
249 #define _hwa_write_o(c,o,r,v,...) _hwa_write(o,r,v) HW_EOL(__VA_ARGS__)
252 #define hwa_write__xb1 , _hwa__write__xb1
254 #define _hwa_write__xb1(o,r,bn,bp,v) _hwa_write__xb1_2(hw_##o##_##r,o,r,bn,bp,v)
255 #define _hwa_write__xb1_2(...) _hwa_write__xb1_3(__VA_ARGS__)
256 #define _hwa_write__xb1_3(rc,ra,rwm,rfm,o,r,bn,bp,v) \
257 _hwa_write_##rc( &hwa->o.r, rwm,rfm, bn,bp, v )
265 #define _hwa__write__xb1(o,r,bn,bp,v,...) _hwa_write__xb1(o,r,bn,bp,v)
280 #define _hw_write_m(o,r,...) HW_FC(_hw_wrorm,HW_X((o,r)),__VA_ARGS__,)
282 #define _hw_wrorm_m11(n,o,r,c,a,wm,fm,bn,bp,m,v,...) _hw_write##c(a,wm,fm,m,v)
284 #define hw_writenp__m11 , _hw_writenp_m11
285 #define _hw_writenp_m11(oo,o,r,rc,ra,rwm,rfm,rbn,rbp,n,p,v,...) \
286 _hw_write##rc(ra,rwm,rfm,(((1U<<n)-1)<<p),((v)<<p))
298 #define _hwa_write_m(o,r,...) HW_FC(_hwa_wrorm,HW_X((o,r)),__VA_ARGS__,)
300 #define _hwa_wrorm_m11(n,o,r,c,a,wm,fm,bn,bp,m,v,...) \
301 _hwa_write##c(&hwa->o.r,wm,fm,m,v)
313 #define hwa_writenp__m11 , _hwa_writenp_m11
314 #define _hwa_writenp_m11(oo,o,r,rc,ra,rwm,rfm,rbn,rbp,n,p,v,...) \
315 _hwa_write##rc(&hwa->o.r,rwm,rfm,(((1U<<n)-1)<<p),((v)<<p))
322 #define _hwa_setup_o(o) _hwa_setup00( o, hw_##o )
323 #define _hwa_setup00(...) _hwa_setup01(__VA_ARGS__)
324 #define _hwa_setup01(o,c,...) _hwa_setup_##c(o,__VA_ARGS__)
331 #define _hwa_init_o(o) _hwa_init00( o, hw_##o )
332 #define _hwa_init00(...) _hwa_init01(__VA_ARGS__)
333 #define _hwa_init01(o,c,...) _hwa_init_##c(o,__VA_ARGS__)
340 #define _hwa_solve_o(o) _hwa_solve00( o, hw_##o )
341 #define _hwa_solve00(...) _hwa_solve01(__VA_ARGS__)
342 #define _hwa_solve01(o,c,...) _hwa_solve_##c(o,__VA_ARGS__)
349 #define _hwa_commit_o(o) _hwa_commit00( o, hw_##o )
350 #define _hwa_commit00(...) _hwa_commit01(__VA_ARGS__)
351 #define _hwa_commit01(o,c,...) _hwa_commit_##c(o,__VA_ARGS__)
359 #define _hwa_setup_r(o,r) _hwa_setup_or02(HW_X((o,r)))
360 #define _hwa_setup_or02(...) _hwa_setup_or03(__VA_ARGS__)
361 #define _hwa_setup_or03(m,n,o,r,c,a,...) _hwa_setup_##c(&hwa->o.r, a)
369 #define _hwa_init_r(o,r,v) _hwa_init_reg_2(v,HW_X((o,r)))
370 #define _hwa_init_reg_2(...) _hwa_init_reg_3(__VA_ARGS__)
371 #define _hwa_init_reg_3(v,m,n,o,r,c,a,...) _hwa_set_##c(&hwa->o.r, v)
379 #define _hwa_commit_r(o,r) HW_FC(_hwa_commit,HW_X((o,r)))
381 #define _hwa_commit_m11(n,o,r,c,a,wm,fm,bn,bp,...) _hwa_commit_##c(&hwa->o.r,wm,fm,hwa->commit)
383 #define _hwa_nocommit_r(o,r) HW_FC(_hwa_nocommit,HW_X((o,r)))
385 #define _hwa_nocommit_m11(n,o,r,c,a,wm,fm,bn,bp,...) _hwa_commit_##c(&hwa->o.r,wm,fm,0)
397 #define _hwa_mmask(o,r) HW_FC(_hwa_mmask_,HW_X(o,r))
399 #define _hwa_mmask__m11(n,o,r,c,a,wm,fm,bn,bp,...) (((hwa->o.r.mmask)>>bp)&((1ULL<<bn)-1))
407 #define _hwa_mvalue(o,r) HW_FC(_hwa_mvalue_,HW_X(o,r))
409 #define _hwa_mvalue__m11(n,o,r,c,a,wm,fm,bn,bp,...) (((hwa->o.r.mvalue)>>bp)&((1ULL<<bn)-1))
417 #define _hwa_ovalue(o,r) HW_FC(_hwa_ovalue_,HW_X(o,r))
419 #define _hwa_ovalue__m11(n,o,r,c,a,wm,fm,bn,bp,...) (((hwa->o.r.ovalue)>>bp)&((1ULL<<bn)-1))
423 HW_INLINE
void _hwa_setup__r8 ( hwa_r8_t *r, intptr_t a )
432 HW_INLINE
void _hwa_setup__r16 ( hwa_r16_t *r, intptr_t a )
441 HW_INLINE
void _hwa_setup__r32 ( hwa_r32_t *r, intptr_t a )
459 HWA_E(HW_EM_COMMITRQ);
465 HW_INLINE
void _hwa_set__r16 ( hwa_r16_t *r, uint16_t v )
468 HWA_E(HW_EM_COMMITRQ);
474 HW_INLINE
void _hwa_set__r32 ( hwa_r32_t *r, uint32_t v )
477 HWA_E(HW_EM_COMMITRQ);
479 r->mmask = 0xFFFFFFFF ;
501 HW_INLINE
void _hwa_write_r8 ( hwa_r8_t *r, uint8_t rwm, uint8_t rfm, uint8_t msk, uint8_t v )
504 HWA_E(HW_EM_X(
"_hwa_write_r8: value overflows the mask."));
506 if ((rwm & msk) != msk)
507 HWA_E(HW_EM_X(
"_hwa_write_r8: trying to modify bits that are not writeable."));
509 if ((r->mmask & msk) != 0 && (r->mvalue & msk) != v)
510 HWA_E(HW_EM_COMMITRQ);
514 HWA_E(HW_EM_X(
"_hwa_write_r8: flag bit can only be cleared by writing 1 into it."));
517 r->mvalue = (r->mvalue & ~msk) | (msk & v) ;
520 HW_INLINE
void _hwa_write_r16 ( hwa_r16_t *r, uint16_t rwm, uint16_t rfm, uint16_t msk, uint16_t v )
523 HWA_E(HW_EM_X(
"_hwa_write_r16: value overflows the mask."));
525 if ((rwm & msk) != msk)
526 HWA_E(HW_EM_X(
"_hwa_write_r16: trying to modify bits that are not writeable."));
528 if ((r->mmask & msk) != 0 && (r->mvalue & msk) != v)
529 HWA_E(HW_EM_COMMITRQ);
533 HWA_E(HW_EM_X(
"_hwa_write_r16: flag bit can only be cleared by writing 1 into it."));
536 r->mvalue = (r->mvalue & ~msk) | (msk & v) ;
539 HW_INLINE
void _hwa_write_r32 ( hwa_r32_t *r, uint32_t rwm, uint32_t rfm, uint32_t msk, uint32_t v )
541 if ( (v & msk & rwm) != v )
542 HWA_E(HW_EM_X(
"_hwa_write_r32: value overflow."));
544 if ((rwm & msk) != msk && msk != 0xFFFFFFFF )
545 HWA_E(HW_EM_X(
"_hwa_write_r32: trying to modify bits that are not writeable."));
547 if ((r->mmask & msk) != 0 && (r->mvalue & msk) != v)
548 HWA_E(HW_EM_COMMITRQ);
552 HWA_E(HW_EM_X(
"_hwa_write_r32: flag bit can only be cleared by writing 1 into it."));
555 r->mvalue = (r->mvalue & ~msk) | (msk & v) ;
566 if (x) {
HWA_E(HW_EM_OPTIM); }
570 #define _hw_write__r8(ra,rwm,rfm,bn,bp,v) _hw_write_r8(ra,rwm,rfm,((1UL<<bn)-1)<<bp,((uint8_t)(v))<<bp)
571 #define _hw_write__r16(ra,rwm,rfm,bn,bp,v) _hw_write_r16(ra,rwm,rfm,((1UL<<bn)-1)<<bp,(v)<<bp)
572 #define _hw_write__r32(ra,rwm,rfm,bn,bp,v) _hw_write_r32(ra,rwm,rfm,((1ULL<<bn)-1)<<bp,(v)<<bp)
574 #define _hwa_write__r8(ra,rwm,rfm,bn,bp,v) _hwa_write_r8(ra,rwm,rfm,((1UL<<bn)-1)<<bp,((uint8_t)(v))<<bp)
575 #define _hwa_write__r16(ra,rwm,rfm,bn,bp,v) _hwa_write_r16(ra,rwm,rfm,((1UL<<bn)-1)<<bp,(v)<<bp)
576 #define _hwa_write__r32(ra,rwm,rfm,bn,bp,v) _hwa_write_r32(ra,rwm,rfm,((1ULL<<bn)-1)<<bp,(v)<<bp)