diff --git a/sysmoOCTSIM/hri/hri_supc_e54.h b/sysmoOCTSIM/hri/hri_supc_e54.h
index 3f38d15..501c36f 100644
--- a/sysmoOCTSIM/hri/hri_supc_e54.h
+++ b/sysmoOCTSIM/hri/hri_supc_e54.h
@@ -3,7 +3,7 @@
  *
  * \brief SAM SUPC
  *
- * Copyright (c) 2016-2018 Microchip Technology Inc. and its subsidiaries.
+ * Copyright (c) 2016-2019 Microchip Technology Inc. and its subsidiaries.
  *
  * \asf_license_start
  *
@@ -53,7 +53,6 @@
 typedef uint32_t hri_supc_bbps_reg_t;
 typedef uint32_t hri_supc_bkin_reg_t;
 typedef uint32_t hri_supc_bkout_reg_t;
-typedef uint32_t hri_supc_bod12_reg_t;
 typedef uint32_t hri_supc_bod33_reg_t;
 typedef uint32_t hri_supc_intenset_reg_t;
 typedef uint32_t hri_supc_intflag_reg_t;
@@ -91,36 +90,6 @@
 	((Supc *)hw)->INTFLAG.reg = SUPC_INTFLAG_B33SRDY;
 }
 
-static inline bool hri_supc_get_INTFLAG_BOD12RDY_bit(const void *const hw)
-{
-	return (((Supc *)hw)->INTFLAG.reg & SUPC_INTFLAG_BOD12RDY) >> SUPC_INTFLAG_BOD12RDY_Pos;
-}
-
-static inline void hri_supc_clear_INTFLAG_BOD12RDY_bit(const void *const hw)
-{
-	((Supc *)hw)->INTFLAG.reg = SUPC_INTFLAG_BOD12RDY;
-}
-
-static inline bool hri_supc_get_INTFLAG_BOD12DET_bit(const void *const hw)
-{
-	return (((Supc *)hw)->INTFLAG.reg & SUPC_INTFLAG_BOD12DET) >> SUPC_INTFLAG_BOD12DET_Pos;
-}
-
-static inline void hri_supc_clear_INTFLAG_BOD12DET_bit(const void *const hw)
-{
-	((Supc *)hw)->INTFLAG.reg = SUPC_INTFLAG_BOD12DET;
-}
-
-static inline bool hri_supc_get_INTFLAG_B12SRDY_bit(const void *const hw)
-{
-	return (((Supc *)hw)->INTFLAG.reg & SUPC_INTFLAG_B12SRDY) >> SUPC_INTFLAG_B12SRDY_Pos;
-}
-
-static inline void hri_supc_clear_INTFLAG_B12SRDY_bit(const void *const hw)
-{
-	((Supc *)hw)->INTFLAG.reg = SUPC_INTFLAG_B12SRDY;
-}
-
 static inline bool hri_supc_get_INTFLAG_VREGRDY_bit(const void *const hw)
 {
 	return (((Supc *)hw)->INTFLAG.reg & SUPC_INTFLAG_VREGRDY) >> SUPC_INTFLAG_VREGRDY_Pos;
@@ -171,36 +140,6 @@
 	((Supc *)hw)->INTFLAG.reg = SUPC_INTFLAG_B33SRDY;
 }
 
-static inline bool hri_supc_get_interrupt_BOD12RDY_bit(const void *const hw)
-{
-	return (((Supc *)hw)->INTFLAG.reg & SUPC_INTFLAG_BOD12RDY) >> SUPC_INTFLAG_BOD12RDY_Pos;
-}
-
-static inline void hri_supc_clear_interrupt_BOD12RDY_bit(const void *const hw)
-{
-	((Supc *)hw)->INTFLAG.reg = SUPC_INTFLAG_BOD12RDY;
-}
-
-static inline bool hri_supc_get_interrupt_BOD12DET_bit(const void *const hw)
-{
-	return (((Supc *)hw)->INTFLAG.reg & SUPC_INTFLAG_BOD12DET) >> SUPC_INTFLAG_BOD12DET_Pos;
-}
-
-static inline void hri_supc_clear_interrupt_BOD12DET_bit(const void *const hw)
-{
-	((Supc *)hw)->INTFLAG.reg = SUPC_INTFLAG_BOD12DET;
-}
-
-static inline bool hri_supc_get_interrupt_B12SRDY_bit(const void *const hw)
-{
-	return (((Supc *)hw)->INTFLAG.reg & SUPC_INTFLAG_B12SRDY) >> SUPC_INTFLAG_B12SRDY_Pos;
-}
-
-static inline void hri_supc_clear_interrupt_B12SRDY_bit(const void *const hw)
-{
-	((Supc *)hw)->INTFLAG.reg = SUPC_INTFLAG_B12SRDY;
-}
-
 static inline bool hri_supc_get_interrupt_VREGRDY_bit(const void *const hw)
 {
 	return (((Supc *)hw)->INTFLAG.reg & SUPC_INTFLAG_VREGRDY) >> SUPC_INTFLAG_VREGRDY_Pos;
@@ -311,78 +250,6 @@
 	((Supc *)hw)->INTENCLR.reg = SUPC_INTENSET_B33SRDY;
 }
 
-static inline void hri_supc_set_INTEN_BOD12RDY_bit(const void *const hw)
-{
-	((Supc *)hw)->INTENSET.reg = SUPC_INTENSET_BOD12RDY;
-}
-
-static inline bool hri_supc_get_INTEN_BOD12RDY_bit(const void *const hw)
-{
-	return (((Supc *)hw)->INTENSET.reg & SUPC_INTENSET_BOD12RDY) >> SUPC_INTENSET_BOD12RDY_Pos;
-}
-
-static inline void hri_supc_write_INTEN_BOD12RDY_bit(const void *const hw, bool value)
-{
-	if (value == 0x0) {
-		((Supc *)hw)->INTENCLR.reg = SUPC_INTENSET_BOD12RDY;
-	} else {
-		((Supc *)hw)->INTENSET.reg = SUPC_INTENSET_BOD12RDY;
-	}
-}
-
-static inline void hri_supc_clear_INTEN_BOD12RDY_bit(const void *const hw)
-{
-	((Supc *)hw)->INTENCLR.reg = SUPC_INTENSET_BOD12RDY;
-}
-
-static inline void hri_supc_set_INTEN_BOD12DET_bit(const void *const hw)
-{
-	((Supc *)hw)->INTENSET.reg = SUPC_INTENSET_BOD12DET;
-}
-
-static inline bool hri_supc_get_INTEN_BOD12DET_bit(const void *const hw)
-{
-	return (((Supc *)hw)->INTENSET.reg & SUPC_INTENSET_BOD12DET) >> SUPC_INTENSET_BOD12DET_Pos;
-}
-
-static inline void hri_supc_write_INTEN_BOD12DET_bit(const void *const hw, bool value)
-{
-	if (value == 0x0) {
-		((Supc *)hw)->INTENCLR.reg = SUPC_INTENSET_BOD12DET;
-	} else {
-		((Supc *)hw)->INTENSET.reg = SUPC_INTENSET_BOD12DET;
-	}
-}
-
-static inline void hri_supc_clear_INTEN_BOD12DET_bit(const void *const hw)
-{
-	((Supc *)hw)->INTENCLR.reg = SUPC_INTENSET_BOD12DET;
-}
-
-static inline void hri_supc_set_INTEN_B12SRDY_bit(const void *const hw)
-{
-	((Supc *)hw)->INTENSET.reg = SUPC_INTENSET_B12SRDY;
-}
-
-static inline bool hri_supc_get_INTEN_B12SRDY_bit(const void *const hw)
-{
-	return (((Supc *)hw)->INTENSET.reg & SUPC_INTENSET_B12SRDY) >> SUPC_INTENSET_B12SRDY_Pos;
-}
-
-static inline void hri_supc_write_INTEN_B12SRDY_bit(const void *const hw, bool value)
-{
-	if (value == 0x0) {
-		((Supc *)hw)->INTENCLR.reg = SUPC_INTENSET_B12SRDY;
-	} else {
-		((Supc *)hw)->INTENSET.reg = SUPC_INTENSET_B12SRDY;
-	}
-}
-
-static inline void hri_supc_clear_INTEN_B12SRDY_bit(const void *const hw)
-{
-	((Supc *)hw)->INTENCLR.reg = SUPC_INTENSET_B12SRDY;
-}
-
 static inline void hri_supc_set_INTEN_VREGRDY_bit(const void *const hw)
 {
 	((Supc *)hw)->INTENSET.reg = SUPC_INTENSET_VREGRDY;
@@ -475,21 +342,6 @@
 	return (((Supc *)hw)->STATUS.reg & SUPC_STATUS_B33SRDY) >> SUPC_STATUS_B33SRDY_Pos;
 }
 
-static inline bool hri_supc_get_STATUS_BOD12RDY_bit(const void *const hw)
-{
-	return (((Supc *)hw)->STATUS.reg & SUPC_STATUS_BOD12RDY) >> SUPC_STATUS_BOD12RDY_Pos;
-}
-
-static inline bool hri_supc_get_STATUS_BOD12DET_bit(const void *const hw)
-{
-	return (((Supc *)hw)->STATUS.reg & SUPC_STATUS_BOD12DET) >> SUPC_STATUS_BOD12DET_Pos;
-}
-
-static inline bool hri_supc_get_STATUS_B12SRDY_bit(const void *const hw)
-{
-	return (((Supc *)hw)->STATUS.reg & SUPC_STATUS_B12SRDY) >> SUPC_STATUS_B12SRDY_Pos;
-}
-
 static inline bool hri_supc_get_STATUS_VREGRDY_bit(const void *const hw)
 {
 	return (((Supc *)hw)->STATUS.reg & SUPC_STATUS_VREGRDY) >> SUPC_STATUS_VREGRDY_Pos;
@@ -1017,391 +869,6 @@
 	return ((Supc *)hw)->BOD33.reg;
 }
 
-static inline void hri_supc_set_BOD12_ENABLE_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg |= SUPC_BOD12_ENABLE;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline bool hri_supc_get_BOD12_ENABLE_bit(const void *const hw)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_ENABLE) >> SUPC_BOD12_ENABLE_Pos;
-	return (bool)tmp;
-}
-
-static inline void hri_supc_write_BOD12_ENABLE_bit(const void *const hw, bool value)
-{
-	uint32_t tmp;
-	SUPC_CRITICAL_SECTION_ENTER();
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp &= ~SUPC_BOD12_ENABLE;
-	tmp |= value << SUPC_BOD12_ENABLE_Pos;
-	((Supc *)hw)->BOD12.reg = tmp;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_clear_BOD12_ENABLE_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg &= ~SUPC_BOD12_ENABLE;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_toggle_BOD12_ENABLE_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg ^= SUPC_BOD12_ENABLE;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_set_BOD12_HYST_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg |= SUPC_BOD12_HYST;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline bool hri_supc_get_BOD12_HYST_bit(const void *const hw)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_HYST) >> SUPC_BOD12_HYST_Pos;
-	return (bool)tmp;
-}
-
-static inline void hri_supc_write_BOD12_HYST_bit(const void *const hw, bool value)
-{
-	uint32_t tmp;
-	SUPC_CRITICAL_SECTION_ENTER();
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp &= ~SUPC_BOD12_HYST;
-	tmp |= value << SUPC_BOD12_HYST_Pos;
-	((Supc *)hw)->BOD12.reg = tmp;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_clear_BOD12_HYST_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg &= ~SUPC_BOD12_HYST;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_toggle_BOD12_HYST_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg ^= SUPC_BOD12_HYST;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_set_BOD12_STDBYCFG_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg |= SUPC_BOD12_STDBYCFG;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline bool hri_supc_get_BOD12_STDBYCFG_bit(const void *const hw)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_STDBYCFG) >> SUPC_BOD12_STDBYCFG_Pos;
-	return (bool)tmp;
-}
-
-static inline void hri_supc_write_BOD12_STDBYCFG_bit(const void *const hw, bool value)
-{
-	uint32_t tmp;
-	SUPC_CRITICAL_SECTION_ENTER();
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp &= ~SUPC_BOD12_STDBYCFG;
-	tmp |= value << SUPC_BOD12_STDBYCFG_Pos;
-	((Supc *)hw)->BOD12.reg = tmp;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_clear_BOD12_STDBYCFG_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg &= ~SUPC_BOD12_STDBYCFG;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_toggle_BOD12_STDBYCFG_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg ^= SUPC_BOD12_STDBYCFG;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_set_BOD12_RUNSTDBY_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg |= SUPC_BOD12_RUNSTDBY;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline bool hri_supc_get_BOD12_RUNSTDBY_bit(const void *const hw)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_RUNSTDBY) >> SUPC_BOD12_RUNSTDBY_Pos;
-	return (bool)tmp;
-}
-
-static inline void hri_supc_write_BOD12_RUNSTDBY_bit(const void *const hw, bool value)
-{
-	uint32_t tmp;
-	SUPC_CRITICAL_SECTION_ENTER();
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp &= ~SUPC_BOD12_RUNSTDBY;
-	tmp |= value << SUPC_BOD12_RUNSTDBY_Pos;
-	((Supc *)hw)->BOD12.reg = tmp;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_clear_BOD12_RUNSTDBY_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg &= ~SUPC_BOD12_RUNSTDBY;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_toggle_BOD12_RUNSTDBY_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg ^= SUPC_BOD12_RUNSTDBY;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_set_BOD12_ACTCFG_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg |= SUPC_BOD12_ACTCFG;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline bool hri_supc_get_BOD12_ACTCFG_bit(const void *const hw)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_ACTCFG) >> SUPC_BOD12_ACTCFG_Pos;
-	return (bool)tmp;
-}
-
-static inline void hri_supc_write_BOD12_ACTCFG_bit(const void *const hw, bool value)
-{
-	uint32_t tmp;
-	SUPC_CRITICAL_SECTION_ENTER();
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp &= ~SUPC_BOD12_ACTCFG;
-	tmp |= value << SUPC_BOD12_ACTCFG_Pos;
-	((Supc *)hw)->BOD12.reg = tmp;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_clear_BOD12_ACTCFG_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg &= ~SUPC_BOD12_ACTCFG;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_toggle_BOD12_ACTCFG_bit(const void *const hw)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg ^= SUPC_BOD12_ACTCFG;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_set_BOD12_ACTION_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg |= SUPC_BOD12_ACTION(mask);
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline hri_supc_bod12_reg_t hri_supc_get_BOD12_ACTION_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_ACTION(mask)) >> SUPC_BOD12_ACTION_Pos;
-	return tmp;
-}
-
-static inline void hri_supc_write_BOD12_ACTION_bf(const void *const hw, hri_supc_bod12_reg_t data)
-{
-	uint32_t tmp;
-	SUPC_CRITICAL_SECTION_ENTER();
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp &= ~SUPC_BOD12_ACTION_Msk;
-	tmp |= SUPC_BOD12_ACTION(data);
-	((Supc *)hw)->BOD12.reg = tmp;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_clear_BOD12_ACTION_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg &= ~SUPC_BOD12_ACTION(mask);
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_toggle_BOD12_ACTION_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg ^= SUPC_BOD12_ACTION(mask);
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline hri_supc_bod12_reg_t hri_supc_read_BOD12_ACTION_bf(const void *const hw)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_ACTION_Msk) >> SUPC_BOD12_ACTION_Pos;
-	return tmp;
-}
-
-static inline void hri_supc_set_BOD12_PSEL_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg |= SUPC_BOD12_PSEL(mask);
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline hri_supc_bod12_reg_t hri_supc_get_BOD12_PSEL_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_PSEL(mask)) >> SUPC_BOD12_PSEL_Pos;
-	return tmp;
-}
-
-static inline void hri_supc_write_BOD12_PSEL_bf(const void *const hw, hri_supc_bod12_reg_t data)
-{
-	uint32_t tmp;
-	SUPC_CRITICAL_SECTION_ENTER();
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp &= ~SUPC_BOD12_PSEL_Msk;
-	tmp |= SUPC_BOD12_PSEL(data);
-	((Supc *)hw)->BOD12.reg = tmp;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_clear_BOD12_PSEL_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg &= ~SUPC_BOD12_PSEL(mask);
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_toggle_BOD12_PSEL_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg ^= SUPC_BOD12_PSEL(mask);
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline hri_supc_bod12_reg_t hri_supc_read_BOD12_PSEL_bf(const void *const hw)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_PSEL_Msk) >> SUPC_BOD12_PSEL_Pos;
-	return tmp;
-}
-
-static inline void hri_supc_set_BOD12_LEVEL_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg |= SUPC_BOD12_LEVEL(mask);
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline hri_supc_bod12_reg_t hri_supc_get_BOD12_LEVEL_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_LEVEL(mask)) >> SUPC_BOD12_LEVEL_Pos;
-	return tmp;
-}
-
-static inline void hri_supc_write_BOD12_LEVEL_bf(const void *const hw, hri_supc_bod12_reg_t data)
-{
-	uint32_t tmp;
-	SUPC_CRITICAL_SECTION_ENTER();
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp &= ~SUPC_BOD12_LEVEL_Msk;
-	tmp |= SUPC_BOD12_LEVEL(data);
-	((Supc *)hw)->BOD12.reg = tmp;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_clear_BOD12_LEVEL_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg &= ~SUPC_BOD12_LEVEL(mask);
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_toggle_BOD12_LEVEL_bf(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg ^= SUPC_BOD12_LEVEL(mask);
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline hri_supc_bod12_reg_t hri_supc_read_BOD12_LEVEL_bf(const void *const hw)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp = (tmp & SUPC_BOD12_LEVEL_Msk) >> SUPC_BOD12_LEVEL_Pos;
-	return tmp;
-}
-
-static inline void hri_supc_set_BOD12_reg(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg |= mask;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline hri_supc_bod12_reg_t hri_supc_get_BOD12_reg(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	uint32_t tmp;
-	tmp = ((Supc *)hw)->BOD12.reg;
-	tmp &= mask;
-	return tmp;
-}
-
-static inline void hri_supc_write_BOD12_reg(const void *const hw, hri_supc_bod12_reg_t data)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg = data;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_clear_BOD12_reg(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg &= ~mask;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline void hri_supc_toggle_BOD12_reg(const void *const hw, hri_supc_bod12_reg_t mask)
-{
-	SUPC_CRITICAL_SECTION_ENTER();
-	((Supc *)hw)->BOD12.reg ^= mask;
-	SUPC_CRITICAL_SECTION_LEAVE();
-}
-
-static inline hri_supc_bod12_reg_t hri_supc_read_BOD12_reg(const void *const hw)
-{
-	return ((Supc *)hw)->BOD12.reg;
-}
-
 static inline void hri_supc_set_VREG_ENABLE_bit(const void *const hw)
 {
 	SUPC_CRITICAL_SECTION_ENTER();
