pic32-config-sector 0.1.2

Calculate constant values for PIC32 configuration words
Documentation
#![allow(non_snake_case)]
#![allow(non_camel_case_types)]
#![allow(clippy::upper_case_acronyms)]
/// Length of config word sector in words
pub const CONFIG_SECTOR_LENGTH: usize = 16;

type USERID = u16;

/// Ethernet RMII/MII Enable
pub enum FMIIEN {
    /// RMII Enabled
    OFF = 0x0,

    /// MII Enabled
    ON = 0x1,
}

/// Ethernet I/O Pin Select
pub enum FETHIO {
    /// Alternate Ethernet I/O
    OFF = 0x0,

    /// Default Ethernet I/O
    ON = 0x1,
}

/// Permission Group Lock One Way Configuration
pub enum PGL1WAY {
    /// Allow only one reconfiguration
    ON = 0x1,

    /// Allow multiple reconfigurations
    OFF = 0x0,
}

/// Peripheral Module Disable Configuration
pub enum PMDL1WAY {
    /// Allow only one reconfiguration
    ON = 0x1,

    /// Allow multiple reconfigurations
    OFF = 0x0,
}

/// Peripheral Pin Select Configuration
pub enum IOL1WAY {
    /// Allow only one reconfiguration
    ON = 0x1,

    /// Allow multiple reconfigurations
    OFF = 0x0,
}

/// USB USBID Selection
pub enum FUSBIDIO {
    /// Controlled by Port Function
    OFF = 0x0,

    /// Controlled by the USB Module
    ON = 0x1,
}

/// System PLL Input Divider
pub enum FPLLIDIV {
    /// 1x Divider
    DIV_1 = 0x0,

    /// 2x Divider
    DIV_2 = 0x1,

    /// 3x Divider
    DIV_3 = 0x2,

    /// 4x Divider
    DIV_4 = 0x3,

    /// 5x Divider
    DIV_5 = 0x4,

    /// 6x Divider
    DIV_6 = 0x5,

    /// 7x Divider
    DIV_7 = 0x6,

    /// 8x Divider
    DIV_8 = 0x7,
}

/// System PLL Input Range
pub enum FPLLRNG {
    /// Bypass
    RANGE_BYPASS = 0x0,

    /// 5-10 MHz Input
    RANGE_5_10_MHZ = 0x1,

    /// 8-16 MHz Input
    RANGE_8_16_MHZ = 0x2,

    /// 13-26 MHz Input
    RANGE_13_26_MHZ = 0x3,

    /// 21-42 MHz Input
    RANGE_21_42_MHZ = 0x4,

    /// 34-68 MHz Input
    RANGE_34_68_MHZ = 0x5,
}

/// System PLL Input Clock Selection
pub enum FPLLICLK {
    /// FRC is input to the System PLL
    PLL_FRC = 0x1,

    /// POSC is input to the System PLL
    PLL_POSC = 0x0,
}

/// System PLL Multiplier
pub enum FPLLMULT {
    /// PLL Multiply by 1
    MUL_1 = 0x0,

    /// PLL Multiply by 2
    MUL_2 = 0x1,

    /// PLL Multiply by 3
    MUL_3 = 0x2,

    /// PLL Multiply by 4
    MUL_4 = 0x3,

    /// PLL Multiply by 5
    MUL_5 = 0x4,

    /// PLL Multiply by 6
    MUL_6 = 0x5,

    /// PLL Multiply by 7
    MUL_7 = 0x6,

    /// PLL Multiply by 8
    MUL_8 = 0x7,

    /// PLL Multiply by 9
    MUL_9 = 0x8,

    /// PLL Multiply by 10
    MUL_10 = 0x9,

    /// PLL Multiply by 11
    MUL_11 = 0xa,

    /// PLL Multiply by 12
    MUL_12 = 0xb,

    /// PLL Multiply by 13
    MUL_13 = 0xc,

    /// PLL Multiply by 14
    MUL_14 = 0xd,

    /// PLL Multiply by 15
    MUL_15 = 0xe,

    /// PLL Multiply by 16
    MUL_16 = 0xf,

    /// PLL Multiply by 17
    MUL_17 = 0x10,

    /// PLL Multiply by 18
    MUL_18 = 0x11,

    /// PLL Multiply by 19
    MUL_19 = 0x12,

    /// PLL Multiply by 20
    MUL_20 = 0x13,

    /// PLL Multiply by 21
    MUL_21 = 0x14,

    /// PLL Multiply by 22
    MUL_22 = 0x15,

    /// PLL Multiply by 23
    MUL_23 = 0x16,

    /// PLL Multiply by 24
    MUL_24 = 0x17,

    /// PLL Multiply by 25
    MUL_25 = 0x18,

    /// PLL Multiply by 26
    MUL_26 = 0x19,

    /// PLL Multiply by 27
    MUL_27 = 0x1a,

    /// PLL Multiply by 28
    MUL_28 = 0x1b,

    /// PLL Multiply by 29
    MUL_29 = 0x1c,

    /// PLL Multiply by 30
    MUL_30 = 0x1d,

    /// PLL Multiply by 31
    MUL_31 = 0x1e,

    /// PLL Multiply by 32
    MUL_32 = 0x1f,

    /// PLL Multiply by 33
    MUL_33 = 0x20,

    /// PLL Multiply by 34
    MUL_34 = 0x21,

    /// PLL Multiply by 35
    MUL_35 = 0x22,

    /// PLL Multiply by 36
    MUL_36 = 0x23,

    /// PLL Multiply by 37
    MUL_37 = 0x24,

    /// PLL Multiply by 38
    MUL_38 = 0x25,

    /// PLL Multiply by 39
    MUL_39 = 0x26,

    /// PLL Multiply by 40
    MUL_40 = 0x27,

    /// PLL Multiply by 41
    MUL_41 = 0x28,

    /// PLL Multiply by 42
    MUL_42 = 0x29,

    /// PLL Multiply by 43
    MUL_43 = 0x2a,

    /// PLL Multiply by 44
    MUL_44 = 0x2b,

    /// PLL Multiply by 45
    MUL_45 = 0x2c,

    /// PLL Multiply by 46
    MUL_46 = 0x2d,

    /// PLL Multiply by 47
    MUL_47 = 0x2e,

    /// PLL Multiply by 48
    MUL_48 = 0x2f,

    /// PLL Multiply by 49
    MUL_49 = 0x30,

    /// PLL Multiply by 50
    MUL_50 = 0x31,

    /// PLL Multiply by 51
    MUL_51 = 0x32,

    /// PLL Multiply by 52
    MUL_52 = 0x33,

    /// PLL Multiply by 53
    MUL_53 = 0x34,

    /// PLL Multiply by 54
    MUL_54 = 0x35,

    /// PLL Multiply by 55
    MUL_55 = 0x36,

    /// PLL Multiply by 56
    MUL_56 = 0x37,

    /// PLL Multiply by 57
    MUL_57 = 0x38,

    /// PLL Multiply by 58
    MUL_58 = 0x39,

    /// PLL Multiply by 59
    MUL_59 = 0x3a,

    /// PLL Multiply by 60
    MUL_60 = 0x3b,

    /// PLL Multiply by 61
    MUL_61 = 0x3c,

    /// PLL Multiply by 62
    MUL_62 = 0x3d,

    /// PLL Multiply by 63
    MUL_63 = 0x3e,

    /// PLL Multiply by 64
    MUL_64 = 0x3f,

    /// PLL Multiply by 65
    MUL_65 = 0x40,

    /// PLL Multiply by 66
    MUL_66 = 0x41,

    /// PLL Multiply by 67
    MUL_67 = 0x42,

    /// PLL Multiply by 68
    MUL_68 = 0x43,

    /// PLL Multiply by 69
    MUL_69 = 0x44,

    /// PLL Multiply by 70
    MUL_70 = 0x45,

    /// PLL Multiply by 71
    MUL_71 = 0x46,

    /// PLL Multiply by 72
    MUL_72 = 0x47,

    /// PLL Multiply by 73
    MUL_73 = 0x48,

    /// PLL Multiply by 74
    MUL_74 = 0x49,

    /// PLL Multiply by 75
    MUL_75 = 0x4a,

    /// PLL Multiply by 76
    MUL_76 = 0x4b,

    /// PLL Multiply by 77
    MUL_77 = 0x4c,

    /// PLL Multiply by 78
    MUL_78 = 0x4d,

    /// PLL Multiply by 79
    MUL_79 = 0x4e,

    /// PLL Multiply by 80
    MUL_80 = 0x4f,

    /// PLL Multiply by 81
    MUL_81 = 0x50,

    /// PLL Multiply by 82
    MUL_82 = 0x51,

    /// PLL Multiply by 83
    MUL_83 = 0x52,

    /// PLL Multiply by 84
    MUL_84 = 0x53,

    /// PLL Multiply by 85
    MUL_85 = 0x54,

    /// PLL Multiply by 86
    MUL_86 = 0x55,

    /// PLL Multiply by 87
    MUL_87 = 0x56,

    /// PLL Multiply by 88
    MUL_88 = 0x57,

    /// PLL Multiply by 89
    MUL_89 = 0x58,

    /// PLL Multiply by 90
    MUL_90 = 0x59,

    /// PLL Multiply by 91
    MUL_91 = 0x5a,

    /// PLL Multiply by 92
    MUL_92 = 0x5b,

    /// PLL Multiply by 93
    MUL_93 = 0x5c,

    /// PLL Multiply by 94
    MUL_94 = 0x5d,

    /// PLL Multiply by 95
    MUL_95 = 0x5e,

    /// PLL Multiply by 96
    MUL_96 = 0x5f,

    /// PLL Multiply by 97
    MUL_97 = 0x60,

    /// PLL Multiply by 98
    MUL_98 = 0x61,

    /// PLL Multiply by 99
    MUL_99 = 0x62,

    /// PLL Multiply by 100
    MUL_100 = 0x63,

    /// PLL Multiply by 101
    MUL_101 = 0x64,

    /// PLL Multiply by 102
    MUL_102 = 0x65,

    /// PLL Multiply by 103
    MUL_103 = 0x66,

    /// PLL Multiply by 104
    MUL_104 = 0x67,

    /// PLL Multiply by 105
    MUL_105 = 0x68,

    /// PLL Multiply by 106
    MUL_106 = 0x69,

    /// PLL Multiply by 107
    MUL_107 = 0x6a,

    /// PLL Multiply by 108
    MUL_108 = 0x6b,

    /// PLL Multiply by 109
    MUL_109 = 0x6c,

    /// PLL Multiply by 110
    MUL_110 = 0x6d,

    /// PLL Multiply by 111
    MUL_111 = 0x6e,

    /// PLL Multiply by 112
    MUL_112 = 0x6f,

    /// PLL Multiply by 113
    MUL_113 = 0x70,

    /// PLL Multiply by 114
    MUL_114 = 0x71,

    /// PLL Multiply by 115
    MUL_115 = 0x72,

    /// PLL Multiply by 116
    MUL_116 = 0x73,

    /// PLL Multiply by 117
    MUL_117 = 0x74,

    /// PLL Multiply by 118
    MUL_118 = 0x75,

    /// PLL Multiply by 119
    MUL_119 = 0x76,

    /// PLL Multiply by 120
    MUL_120 = 0x77,

    /// PLL Multiply by 121
    MUL_121 = 0x78,

    /// PLL Multiply by 122
    MUL_122 = 0x79,

    /// PLL Multiply by 123
    MUL_123 = 0x7a,

    /// PLL Multiply by 124
    MUL_124 = 0x7b,

    /// PLL Multiply by 125
    MUL_125 = 0x7c,

    /// PLL Multiply by 126
    MUL_126 = 0x7d,

    /// PLL Multiply by 127
    MUL_127 = 0x7e,

    /// PLL Multiply by 128
    MUL_128 = 0x7f,
}

/// System PLL Output Clock Divider
pub enum FPLLODIV {
    /// 2x Divider
    DIV_2 = 0x1,

    /// 4x Divider
    DIV_4 = 0x2,

    /// 8x Divider
    DIV_8 = 0x3,

    /// 16x Divider
    DIV_16 = 0x4,

    /// 32x Divider
    DIV_32 = 0x7,
}

/// USB PLL Input Frequency Selection
pub enum UPLLFSEL {
    /// USB PLL input is 24 MHz
    FREQ_24MHZ = 0x1,

    /// USB PLL input is 12 MHz
    FREQ_12MHZ = 0x0,
}

/// Oscillator Selection Bits
pub enum FNOSC {
    /// Fast RC Osc w/Div-by-N (FRCDIV)
    FRCDIV = 0x7,

    /// System PLL
    SPLL = 0x1,

    /// Primary Osc (HS,EC)
    POSC = 0x2,

    /// Low Power Secondary Osc (SOSC)
    SOSC = 0x4,

    /// Low Power RC Osc (LPRC)
    LPRC = 0x5,
}

/// DMT Count Window Interval
pub enum DMTINTV {
    /// Window/Interval value is zero
    WIN_0 = 0x0,

    /// Window/Interval value is 1/2 counter value
    WIN_1_2 = 0x1,

    /// Window/Interval value is 3/4 counter value
    WIN_3_4 = 0x2,

    /// Window/Interval value is 7/8 counter value
    WIN_7_8 = 0x3,

    /// Window/Interval value is 15/16 counter value
    WIN_15_16 = 0x4,

    /// Window/Interval value is 31/32 counter value
    WIN_31_32 = 0x5,

    /// Window/Interval value is 63/64 counter value
    WIN_63_64 = 0x6,

    /// Window/Interval value is 127/128 counter value
    WIN_127_128 = 0x7,
}

/// Secondary Oscillator Enable
pub enum FSOSCEN {
    /// Disable SOSC
    OFF = 0x0,

    /// Enable SOSC
    ON = 0x1,
}

/// Internal/External Switch Over
pub enum IESO {
    /// Disabled
    OFF = 0x0,

    /// Enabled
    ON = 0x1,
}

/// Primary Oscillator Configuration
pub enum POSCMOD {
    /// External clock mode
    EC = 0x0,

    /// HS osc mode
    HS = 0x2,

    /// Primary osc disabled
    OFF = 0x3,
}

/// CLKO Output Signal Active on the OSCO Pin
pub enum OSCIOFNC {
    /// Disabled
    OFF = 0x1,

    /// Enabled
    ON = 0x0,
}

/// Clock Switching and Monitor Selection
pub enum FCKSM {
    /// Clock Switch Disabled, FSCM Disabled
    CSDCMD = 0x0,

    /// Clock Switch Enabled, FSCM Disabled
    CSECMD = 0x1,

    /// Clock Switch Disabled, FSCM Enabled
    CSDCME = 0x2,

    /// Clock Switch Enabled, FSCM Enabled
    CSECME = 0x3,
}

/// Watchdog Timer Postscaler
pub enum WDTPS {
    /// 1:1
    PS1 = 0x0,

    /// 1:2
    PS2 = 0x1,

    /// 1:4
    PS4 = 0x2,

    /// 1:8
    PS8 = 0x3,

    /// 1:16
    PS16 = 0x4,

    /// 1:32
    PS32 = 0x5,

    /// 1:64
    PS64 = 0x6,

    /// 1:128
    PS128 = 0x7,

    /// 1:256
    PS256 = 0x8,

    /// 1:512
    PS512 = 0x9,

    /// 1:1024
    PS1024 = 0xa,

    /// 1:2048
    PS2048 = 0xb,

    /// 1:4096
    PS4096 = 0xc,

    /// 1:8192
    PS8192 = 0xd,

    /// 1:16384
    PS16384 = 0xe,

    /// 1:32768
    PS32768 = 0xf,

    /// 1:65536
    PS65536 = 0x10,

    /// 1:131072
    PS131072 = 0x11,

    /// 1:262144
    PS262144 = 0x12,

    /// 1:524288
    PS524288 = 0x13,

    /// 1:1048576
    PS1048576 = 0x14,
}

/// Watchdog Timer Stop During Flash Programming
pub enum WDTSPGM {
    /// WDT runs during Flash programming
    RUN = 0x0,

    /// WDT stops during Flash programming
    STOP = 0x1,
}

/// Watchdog Timer Window Mode
pub enum WINDIS {
    /// Watchdog Timer is in non-Window mode
    NORMAL = 0x1,

    /// Watchdog Timer is in Window mode
    WINDOW = 0x0,
}

/// Watchdog Timer Enable
pub enum FWDTEN {
    /// WDT Disabled
    OFF = 0x0,

    /// WDT Enabled
    ON = 0x1,
}

/// Watchdog Timer Window Size
pub enum FWDTWINSZ {
    /// Window size is 25%
    WINSZ_25 = 0x3,

    /// Window size is 37.5%
    WINSZ_37 = 0x2,

    /// Window size is 50%
    WINSZ_50 = 0x1,

    /// Window size is 75%
    WINSZ_75 = 0x0,
}

/// Deadman Timer Count Selection
pub enum DMTCNT {
    /// 2^8 (256)
    DMT8 = 0x0,

    /// 2^9 (512)
    DMT9 = 0x1,

    /// 2^10 (1024)
    DMT10 = 0x2,

    /// 2^11 (2048)
    DMT11 = 0x3,

    /// 2^12 (4096)
    DMT12 = 0x4,

    /// 2^13 (8192)
    DMT13 = 0x5,

    /// 2^14 (16384)
    DMT14 = 0x6,

    /// 2^15 (32768)
    DMT15 = 0x7,

    /// 2^16 (65536)
    DMT16 = 0x8,

    /// 2^17 (131072)
    DMT17 = 0x9,

    /// 2^18 (262144)
    DMT18 = 0xa,

    /// 2^19 (524288)
    DMT19 = 0xb,

    /// 2^20 (1048576)
    DMT20 = 0xc,

    /// 2^21 (2097152)
    DMT21 = 0xd,

    /// 2^22 (4194304)
    DMT22 = 0xe,

    /// 2^23 (8388608)
    DMT23 = 0xf,

    /// 2^24 (16777216)
    DMT24 = 0x10,

    /// 2^25 (33554432)
    DMT25 = 0x11,

    /// 2^26 (67108864)
    DMT26 = 0x12,

    /// 2^27 (134217728)
    DMT27 = 0x13,

    /// 2^28 (268435456)
    DMT28 = 0x14,

    /// 2^29 (536870912)
    DMT29 = 0x15,

    /// 2^30 (1073741824)
    DMT30 = 0x16,

    /// 2^31 (2147483648)
    DMT31 = 0x17,
}

/// Deadman Timer Enable
pub enum FDMTEN {
    /// Deadman Timer is enabled
    ON = 0x1,

    /// Deadman Timer is disabled
    OFF = 0x0,
}

/// JTAG Enable
pub enum JTAGEN {
    /// JTAG Port Enabled
    ON = 0x1,

    /// JTAG Disabled
    OFF = 0x0,
}

/// ICE/ICD Comm Channel Select
pub enum ICESEL {
    /// Communicate on PGEC1/PGED1
    ICS_PGx1 = 0x3,

    /// Communicate on PGEC2/PGED2
    ICS_PGx2 = 0x2,
}

/// Trace Enable
pub enum TRCEN {
    /// Trace features in the CPU are enabled
    ON = 0x1,

    /// Trace features in the CPU are disabled
    OFF = 0x0,
}

/// Boot ISA Selection
pub enum BOOTISA {
    /// Boot code and Exception code is MIPS32
    MIPS32 = 0x1,

    /// Boot code and Exception code is microMIPS
    MICROMIPS = 0x0,
}

/// Dynamic Flash ECC Configuration
pub enum FECCCON {
    /// Flash ECC is enabled (ECCCON bits are locked)
    ON = 0x0,

    /// Dynamic Flash ECC is enabled (ECCCON bits are locked)
    DYNAMIC = 0x1,

    /// ECC and Dynamic ECC are disabled (ECCCON bits are locked)
    OFF_LOCKED = 0x2,

    /// ECC and Dynamic ECC are disabled (ECCCON bits are writable)
    OFF_UNLOCKED = 0x3,
}

/// Flash Sleep Mode
pub enum FSLEEP {
    /// Flash is powered down when the device is in Sleep mode
    OFF = 0x1,

    /// Flash power down is controlled by the VREGS bit
    VREGS = 0x0,
}

/// Debug Mode CPU Access Permission
pub enum DBGPER {
    /// Allow CPU access to Permission Group 2 permission regions
    ALLOW_PG2 = 0x4,

    /// Allow CPU access to Permission Group 1 permission regions
    ALLOW_PG1 = 0x2,

    /// Allow CPU access to Permission Group 0 permission regions
    ALLOW_PG0 = 0x1,

    /// PG0: Allow PG1: Allow PG2: Deny
    PG_1_0 = 0x3,

    /// PG0: Allow PG1: Deny PG2: Allow
    PG_2_0 = 0x5,

    /// PG0: Deny PG1: Allow PG2: Allow
    PG_2_1 = 0x6,

    /// Allow CPU access to all permission regions
    PG_ALL = 0x7,

    /// Deny CPU access to all permission regions
    PG_NONE = 0x0,
}

/// Soft Master Clear Enable bit
pub enum SMCLR {
    /// MCLR pin generates a normal system Reset
    MCLR_NORM = 0x1,

    /// MCLR pin generates an emulated POR Reset
    MCLR_POR = 0x0,
}

/// Secondary Oscillator Gain Control bits
pub enum SOSCGAIN {
    /// Gain level 3 (Highest)
    GAIN_LEVEL_3 = 0x3,

    /// Gain level 2
    GAIN_LEVEL_2 = 0x2,

    /// Gain level 1
    GAIN_LEVEL_1 = 0x1,

    /// Gain level 0 (Lowest)
    GAIN_LEVEL_0 = 0x0,
}

/// Secondary Oscillator Boost Kick Start Enable bit
pub enum SOSCBOOST {
    /// Boost the kick start of the oscillator
    ON = 0x1,

    /// Normal start of the oscillator
    OFF = 0x0,
}

/// Primary Oscillator Gain Control bits
pub enum POSCGAIN {
    /// Gain level 3 (Highest)
    GAIN_LEVEL_3 = 0x3,

    /// Gain level 2
    GAIN_LEVEL_2 = 0x2,

    /// Gain level 1
    GAIN_LEVEL_1 = 0x1,

    /// Gain level 0 (Lowest)
    GAIN_LEVEL_0 = 0x0,
}

/// Primary Oscillator Boost Kick Start Enable bit
pub enum POSCBOOST {
    /// Boost the kick start of the oscillator
    ON = 0x1,

    /// Normal start of the oscillator
    OFF = 0x0,
}

/// EJTAG Boot
pub enum EJTAGBEN {
    /// Normal EJTAG functionality
    NORMAL = 0x1,

    /// Reduced EJTAG functionality
    REDUCED = 0x0,
}

/// Code Protect
pub enum CP {
    /// Protection Enabled
    ON = 0x0,

    /// Protection Disabled
    OFF = 0x1,
}

/// Boot Flash True Sequence Number
type TSEQ = u16;

/// Boot Flash Complement Sequence Number
type CSEQ = u16;

/// Configuration word sector
#[repr(C)]
pub struct ConfigSector {
    DEVCFG3: u32,
    DEVCFG2: u32,
    DEVCFG1: u32,
    DEVCFG0: u32,
    DEVCP3: u32,
    DEVCP2: u32,
    DEVCP1: u32,
    DEVCP0: u32,
    DEVSIGN3: u32,
    DEVSIGN2: u32,
    DEVSIGN1: u32,
    DEVSIGN0: u32,
    SEQ3: u32,
    SEQ2: u32,
    SEQ1: u32,
    SEQ0: u32,
}

impl ConfigSector {
    /// Create a builder
    pub const fn default() -> ConfigSectorBuilder {
        ConfigSectorBuilder {
            DEVCFG3: 0xffffffff,
            DEVCFG2: 0xffffffff,
            DEVCFG1: 0xffffffff,
            DEVCFG0: 0xfffff7ff,
            DEVCP3: 0xffffffff,
            DEVCP2: 0xffffffff,
            DEVCP1: 0xffffffff,
            DEVCP0: 0xffffffff,
            DEVSIGN3: 0xffffffff,
            DEVSIGN2: 0xffffffff,
            DEVSIGN1: 0xffffffff,
            DEVSIGN0: 0x7fffffff,
            SEQ3: 0xffffffff,
            SEQ2: 0xffffffff,
            SEQ1: 0xffffffff,
            SEQ0: 0xffffffff,
        }
    }

    /// Convert into a array of 32 bit words consuming this ConfigSector
    pub const fn into_array(self) -> [u32; CONFIG_SECTOR_LENGTH] {
        [
            self.DEVCFG3,
            self.DEVCFG2,
            self.DEVCFG1,
            self.DEVCFG0,
            self.DEVCP3,
            self.DEVCP2,
            self.DEVCP1,
            self.DEVCP0,
            self.DEVSIGN3,
            self.DEVSIGN2,
            self.DEVSIGN1,
            self.DEVSIGN0,
            self.SEQ3,
            self.SEQ2,
            self.SEQ1,
            self.SEQ0,
        ]
    }
}
/// Configuration word sector builder
pub struct ConfigSectorBuilder {
    DEVCFG3: u32,
    DEVCFG2: u32,
    DEVCFG1: u32,
    DEVCFG0: u32,
    DEVCP3: u32,
    DEVCP2: u32,
    DEVCP1: u32,
    DEVCP0: u32,
    DEVSIGN3: u32,
    DEVSIGN2: u32,
    DEVSIGN1: u32,
    DEVSIGN0: u32,
    SEQ3: u32,
    SEQ2: u32,
    SEQ1: u32,
    SEQ0: u32,
}

impl ConfigSectorBuilder {
    pub const fn USERID(mut self, v: USERID) -> Self {
        self.DEVCFG3 &= !0x0000ffff;
        self.DEVCFG3 |= v as u32;
        self
    }

    pub const fn FMIIEN(mut self, v: FMIIEN) -> Self {
        self.DEVCFG3 &= !0x01000000;
        self.DEVCFG3 |= (v as u32) << 24;
        self
    }

    pub const fn FETHIO(mut self, v: FETHIO) -> Self {
        self.DEVCFG3 &= !0x02000000;
        self.DEVCFG3 |= (v as u32) << 25;
        self
    }

    pub const fn PGL1WAY(mut self, v: PGL1WAY) -> Self {
        self.DEVCFG3 &= !0x08000000;
        self.DEVCFG3 |= (v as u32) << 27;
        self
    }

    pub const fn PMDL1WAY(mut self, v: PMDL1WAY) -> Self {
        self.DEVCFG3 &= !0x10000000;
        self.DEVCFG3 |= (v as u32) << 28;
        self
    }

    pub const fn IOL1WAY(mut self, v: IOL1WAY) -> Self {
        self.DEVCFG3 &= !0x20000000;
        self.DEVCFG3 |= (v as u32) << 29;
        self
    }

    pub const fn FUSBIDIO(mut self, v: FUSBIDIO) -> Self {
        self.DEVCFG3 &= !0x40000000;
        self.DEVCFG3 |= (v as u32) << 30;
        self
    }

    pub const fn FPLLIDIV(mut self, v: FPLLIDIV) -> Self {
        self.DEVCFG2 &= !0x00000007;
        self.DEVCFG2 |= v as u32;
        self
    }

    pub const fn FPLLRNG(mut self, v: FPLLRNG) -> Self {
        self.DEVCFG2 &= !0x00000070;
        self.DEVCFG2 |= (v as u32) << 4;
        self
    }

    pub const fn FPLLICLK(mut self, v: FPLLICLK) -> Self {
        self.DEVCFG2 &= !0x00000080;
        self.DEVCFG2 |= (v as u32) << 7;
        self
    }

    pub const fn FPLLMULT(mut self, v: FPLLMULT) -> Self {
        self.DEVCFG2 &= !0x00007f00;
        self.DEVCFG2 |= (v as u32) << 8;
        self
    }

    pub const fn FPLLODIV(mut self, v: FPLLODIV) -> Self {
        self.DEVCFG2 &= !0x00070000;
        self.DEVCFG2 |= (v as u32) << 16;
        self
    }

    pub const fn UPLLFSEL(mut self, v: UPLLFSEL) -> Self {
        self.DEVCFG2 &= !0x40000000;
        self.DEVCFG2 |= (v as u32) << 30;
        self
    }

    pub const fn FNOSC(mut self, v: FNOSC) -> Self {
        self.DEVCFG1 &= !0x00000007;
        self.DEVCFG1 |= v as u32;
        self
    }

    pub const fn DMTINTV(mut self, v: DMTINTV) -> Self {
        self.DEVCFG1 &= !0x00000038;
        self.DEVCFG1 |= (v as u32) << 3;
        self
    }

    pub const fn FSOSCEN(mut self, v: FSOSCEN) -> Self {
        self.DEVCFG1 &= !0x00000040;
        self.DEVCFG1 |= (v as u32) << 6;
        self
    }

    pub const fn IESO(mut self, v: IESO) -> Self {
        self.DEVCFG1 &= !0x00000080;
        self.DEVCFG1 |= (v as u32) << 7;
        self
    }

    pub const fn POSCMOD(mut self, v: POSCMOD) -> Self {
        self.DEVCFG1 &= !0x00000300;
        self.DEVCFG1 |= (v as u32) << 8;
        self
    }

    pub const fn OSCIOFNC(mut self, v: OSCIOFNC) -> Self {
        self.DEVCFG1 &= !0x00000400;
        self.DEVCFG1 |= (v as u32) << 10;
        self
    }

    pub const fn FCKSM(mut self, v: FCKSM) -> Self {
        self.DEVCFG1 &= !0x0000c000;
        self.DEVCFG1 |= (v as u32) << 14;
        self
    }

    pub const fn WDTPS(mut self, v: WDTPS) -> Self {
        self.DEVCFG1 &= !0x001f0000;
        self.DEVCFG1 |= (v as u32) << 16;
        self
    }

    pub const fn WDTSPGM(mut self, v: WDTSPGM) -> Self {
        self.DEVCFG1 &= !0x00200000;
        self.DEVCFG1 |= (v as u32) << 21;
        self
    }

    pub const fn WINDIS(mut self, v: WINDIS) -> Self {
        self.DEVCFG1 &= !0x00400000;
        self.DEVCFG1 |= (v as u32) << 22;
        self
    }

    pub const fn FWDTEN(mut self, v: FWDTEN) -> Self {
        self.DEVCFG1 &= !0x00800000;
        self.DEVCFG1 |= (v as u32) << 23;
        self
    }

    pub const fn FWDTWINSZ(mut self, v: FWDTWINSZ) -> Self {
        self.DEVCFG1 &= !0x03000000;
        self.DEVCFG1 |= (v as u32) << 24;
        self
    }

    pub const fn DMTCNT(mut self, v: DMTCNT) -> Self {
        self.DEVCFG1 &= !0x7c000000;
        self.DEVCFG1 |= (v as u32) << 26;
        self
    }

    pub const fn FDMTEN(mut self, v: FDMTEN) -> Self {
        self.DEVCFG1 &= !0x80000000;
        self.DEVCFG1 |= (v as u32) << 31;
        self
    }

    pub const fn JTAGEN(mut self, v: JTAGEN) -> Self {
        self.DEVCFG0 &= !0x00000004;
        self.DEVCFG0 |= (v as u32) << 2;
        self
    }

    pub const fn ICESEL(mut self, v: ICESEL) -> Self {
        self.DEVCFG0 &= !0x00000018;
        self.DEVCFG0 |= (v as u32) << 3;
        self
    }

    pub const fn TRCEN(mut self, v: TRCEN) -> Self {
        self.DEVCFG0 &= !0x00000020;
        self.DEVCFG0 |= (v as u32) << 5;
        self
    }

    pub const fn BOOTISA(mut self, v: BOOTISA) -> Self {
        self.DEVCFG0 &= !0x00000040;
        self.DEVCFG0 |= (v as u32) << 6;
        self
    }

    pub const fn FECCCON(mut self, v: FECCCON) -> Self {
        self.DEVCFG0 &= !0x00000300;
        self.DEVCFG0 |= (v as u32) << 8;
        self
    }

    pub const fn FSLEEP(mut self, v: FSLEEP) -> Self {
        self.DEVCFG0 &= !0x00000400;
        self.DEVCFG0 |= (v as u32) << 10;
        self
    }

    pub const fn DBGPER(mut self, v: DBGPER) -> Self {
        self.DEVCFG0 &= !0x00007000;
        self.DEVCFG0 |= (v as u32) << 12;
        self
    }

    pub const fn SMCLR(mut self, v: SMCLR) -> Self {
        self.DEVCFG0 &= !0x00008000;
        self.DEVCFG0 |= (v as u32) << 15;
        self
    }

    pub const fn SOSCGAIN(mut self, v: SOSCGAIN) -> Self {
        self.DEVCFG0 &= !0x00030000;
        self.DEVCFG0 |= (v as u32) << 16;
        self
    }

    pub const fn SOSCBOOST(mut self, v: SOSCBOOST) -> Self {
        self.DEVCFG0 &= !0x00040000;
        self.DEVCFG0 |= (v as u32) << 18;
        self
    }

    pub const fn POSCGAIN(mut self, v: POSCGAIN) -> Self {
        self.DEVCFG0 &= !0x00180000;
        self.DEVCFG0 |= (v as u32) << 19;
        self
    }

    pub const fn POSCBOOST(mut self, v: POSCBOOST) -> Self {
        self.DEVCFG0 &= !0x00200000;
        self.DEVCFG0 |= (v as u32) << 21;
        self
    }

    pub const fn EJTAGBEN(mut self, v: EJTAGBEN) -> Self {
        self.DEVCFG0 &= !0x40000000;
        self.DEVCFG0 |= (v as u32) << 30;
        self
    }

    pub const fn CP(mut self, v: CP) -> Self {
        self.DEVCP0 &= !0x10000000;
        self.DEVCP0 |= (v as u32) << 28;
        self
    }

    pub const fn TSEQ(mut self, v: TSEQ) -> Self {
        self.SEQ3 &= !0x0000ffff;
        self.SEQ3 |= v as u32;
        self
    }

    pub const fn CSEQ(mut self, v: CSEQ) -> Self {
        self.SEQ3 &= !0xffff0000;
        self.SEQ3 |= (v as u32) << 16;
        self
    }

    pub const fn build(self) -> ConfigSector {
        ConfigSector {
            DEVCFG3: self.DEVCFG3,
            DEVCFG2: self.DEVCFG2,
            DEVCFG1: self.DEVCFG1,
            DEVCFG0: self.DEVCFG0,
            DEVCP3: self.DEVCP3,
            DEVCP2: self.DEVCP2,
            DEVCP1: self.DEVCP1,
            DEVCP0: self.DEVCP0,
            DEVSIGN3: self.DEVSIGN3,
            DEVSIGN2: self.DEVSIGN2,
            DEVSIGN1: self.DEVSIGN1,
            DEVSIGN0: self.DEVSIGN0,
            SEQ3: self.SEQ3,
            SEQ2: self.SEQ2,
            SEQ1: self.SEQ1,
            SEQ0: self.SEQ0,
        }
    }
}