All files / TRANSPILE/3-Render/codegen/generators/declarationGenerators RegisterMacroGenerator.ts

100% Statements 3/3
100% Branches 2/2
100% Functions 2/2
100% Lines 3/3

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38                                                39x     78x         78x          
/**
 * RegisterMacroGenerator - the `#define` text for a register block (ADR-004).
 *
 * A pure function of `IPlannedRegisterMember[]`: it formats, it does not
 * decide. #1445 box 3 -- it used to take `RegisterMemberContext[]` and an
 * orchestrator and do both, which put the grammar in the render layer to
 * obtain four strings per member.
 */
import IPlannedRegisterMember from "../../types/IPlannedRegisterMember";
import QualifiedCName from "../../../../../utils/QualifiedCName";
 
/**
 * Generate #define macros for register members.
 *
 * @param members - The planned members, in declaration order
 * @param prefix - Prefix for macro names (e.g., "GPIO7" or "Teensy4_GPIO7")
 * @param baseAddress - Base address expression string
 * @returns Array of #define lines
 */
function generateRegisterMacros(
  members: readonly IPlannedRegisterMember[],
  prefix: string,
  baseAddress: string,
): string[] {
  return members.map((member) => {
    // Determine qualifiers based on access mode
    const cast =
      member.access === "ro"
        ? `volatile ${member.cType} const *`
        : `volatile ${member.cType}*`;
 
    // Generate: #define PREFIX_REGNAME (*(volatile type*)(base + offset))
    return `#define ${QualifiedCName.fromParts([prefix, member.name])} (*(${cast})(${baseAddress} + ${member.offset}))`;
  });
}
 
export default generateRegisterMacros;