~ruther/avr-shift-registers

1f2a92a06212f4f39cef70035f3250a2ae43e640 — František Boháček 5 years ago c5b0c62
fix: code
8 files changed, 72 insertions(+), 607 deletions(-)

M .gitignore
M simavr/CMakeLists.txt
M simavr/main.c
D simavr/main.i
M src/sr/CMakeLists.txt
M src/sr/data_position.c
M src/sr/seduce.h
M src/sr/sipo_shift_register.c
M .gitignore => .gitignore +6 -1
@@ 36,4 36,9 @@ build/

# doxygen
html/
latex/
\ No newline at end of file
latex/

*.hex
*.elf
*.lst
*.map

M simavr/CMakeLists.txt => simavr/CMakeLists.txt +29 -21
@@ 40,39 40,47 @@ message(STATUS "Set CMAKE_FIND_ROOT_PATH to ${CMAKE_FIND_ROOT_PATH}")
message(STATUS "Set CMAKE_SYSTEM_INCLUDE_PATH to ${CMAKE_SYSTEM_INCLUDE_PATH}")
message(STATUS "Set CMAKE_SYSTEM_LIBRARY_PATH to ${CMAKE_SYSTEM_LIBRARY_PATH}")

if(CMAKE_BUILD_TYPE MATCHES Release)
   set(CMAKE_C_FLAGS_RELEASE "-Os")
   set(CMAKE_CXX_FLAGS_RELEASE "-Os")
endif(CMAKE_BUILD_TYPE MATCHES Release)

if(CMAKE_BUILD_TYPE MATCHES Debug)
   set(CMAKE_C_FLAGS_DEBUG "-O0 -save-temps -g -gdwarf-3 -gstrict-dwarf")
   set(CMAKE_CXX_FLAGS_DEBUG "-O0 -save-temps -g -gdwarf-3 -gstrict-dwarf")
endif(CMAKE_BUILD_TYPE MATCHES Debug)
set(CMAKE_C_FLAGS_RELEASE "-O3 -g")
set(CMAKE_CXX_FLAGS_RELEASE "-O3 -g")

add_definitions("-DF_CPU=${MCU_SPEED}")
add_definitions("-fpack-struct")
add_definitions("-fshort-enums")
add_definitions("-Wall")
add_definitions("-Werror")
# add_definitions("-Werror")
# http://gcc.gnu.org/onlinedocs/gcc-4.8.2/gcc/Alternate-Keywords.html#Alternate-Keywords
# [...]-pedantic and other options cause warnings for many GNU C extensions. You can prevent such warnings within
# one expression by writing __extension__ before the expression. __extension__ has no effect aside from this.[...] 
add_definitions("-pedantic")
add_definitions("-pedantic-errors")
add_definitions("-funsigned-char")
add_definitions("-funsigned-bitfields")
add_definitions("-ffunction-sections")
add_definitions("-c")
add_definitions("-std=gnu99")
 add_definitions("-pedantic")
 add_definitions("-pedantic-errors")
 add_definitions("-funsigned-char")
 add_definitions("-funsigned-bitfields")
 add_definitions("-ffunction-sections")
 add_definitions("-c")
 add_definitions("-std=gnu99")

add_subdirectory(../ src/sr)

add_vcd_trace(
  simavr_shift_registers
  "SIPO_SRCLR,0,PORTB"
  "SIPO_SRCLK,1,PORTB"
  "SIPO_SER,2,PORTB"
  "SIPO_OE,3,PORTB"
  "SIPO_RCLK,4,PORTB"
  "DDR_SIPO_SRCLR,0,DDRB"
  "DDR_SIPO_SRCLK,1,DDRB"
  "DDR_SIPO_SER,2,DDRB"
  "DDR_SIPO_OE,3,DDRB"
  "DDR_SIPO_RCLK,4,DDRB"
)

include_directories(../src)

add_avr_executable(
    simavr-shift-registers
    simavr_shift_registers
    main.c
    ${simavr_shift_registers_VCD_TRACE_FILE}
)

avr_target_include_directories(simavr-shift-registers PRIVATE ../src)

avr_target_link_libraries(simavr-shift-registers avr-shift-registers)
\ No newline at end of file
avr_target_link_libraries(simavr_shift_registers avr_shift_registers)
\ No newline at end of file

M simavr/main.c => simavr/main.c +31 -1
@@ 1,9 1,17 @@
#include <sr/seduce.h>
#include <avr/io.h>
#include <util/delay.h>
#include <stdlib.h>


int main(void)
{
    DDRB = 0xFF;
    PORTB = 0xFF;

    _delay_ms(100);
    DDRB = 0;
    PORTB = 0;
    // SIPO
    ShiftRegisterHandle sipoSrHandle = avr_sipo_shift_register_create(
        data_position_create(&DDRB, &PORTB, &PINB, 0), // SIPO_SRCLR


@@ 13,12 21,20 @@ int main(void)
        data_position_create(&DDRB, &PORTB, &PINB, 4), // SIPO_RCLK
        1
    );
    _delay_ms(100);

    avr_sipo_shift_register_init(sipoSrHandle);
    _delay_ms(100);

    avr_sipo_shift_register_write_byte(sipoSrHandle, 207); // 0b11001111
    _delay_ms(100);
    avr_sipo_shift_register_push_data_to_output(sipoSrHandle);
    _delay_ms(100);
    avr_sipo_shift_register_enable_output(sipoSrHandle);
    _delay_ms(100);

    avr_sipo_shift_register_destroy(sipoSrHandle);
    _delay_ms(100);

    // ------------
    // PISO


@@ 31,7 47,21 @@ int main(void)
        data_position_create(&DDRC, &PORTC, &PINC, 3), // PISO_PL
        1
    );
    _delay_ms(100);

    avr_piso_shift_register_init(pisoSrHandle);

    avr_piso_shift_register_parallel_load(pisoSrHandle);
    avr_piso_shift_register_read_byte(pisoSrHandle);
}
\ No newline at end of file

    avr_piso_shift_register_destroy(sipoSrHandle);

    DDRB = 0xFF;
    PORTB = 0xFF;

    _delay_ms(100);
    DDRB = 0;
    PORTB = 0;

    return 0;
}

D simavr/main.i => simavr/main.i +0 -578
@@ 1,578 0,0 @@
# 1 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/main.c"
# 1 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr//"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/main.c"
# 1 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h" 1
# 28 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
typedef void* ShiftRegisterHandle;
typedef uint8_t bool;
typedef uint8_t byte;
# 47 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
typedef struct {
    volatile byte* ddr;
    volatile byte* port;
    volatile byte* pin;
    byte position;
} DataPosition;
# 64 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern const DataPosition* data_position_create(volatile byte* ddr, volatile byte* port, volatile byte* pin, byte position);






extern void data_position_destroy(const DataPosition* position);
# 80 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern bool data_position_get_pin(const DataPosition* position);
# 91 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void data_position_set_port(const DataPosition* position);
# 102 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void data_position_reset_port(const DataPosition* position);
# 111 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void data_position_set_ddr(const DataPosition* position);
# 120 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void data_position_reset_ddr(const DataPosition* position);
# 137 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_shift_register_clock_pulse(ShiftRegisterHandle shiftRegisterHandle);
# 152 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_shift_register_enable_clock(ShiftRegisterHandle shiftRegisterHandle);
# 164 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_shift_register_disable_clock(ShiftRegisterHandle shiftRegisterHandle);
# 190 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern ShiftRegisterHandle avr_piso_shift_register_create(
    const DataPosition clockEnable,
    const DataPosition clockPulse,
    const DataPosition output,
    const DataPosition parallelLoad,
    int waitTime
);
# 208 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_piso_shift_register_init(ShiftRegisterHandle shiftRegisterHandle);






extern void avr_piso_shift_register_destroy(ShiftRegisterHandle shiftRegisterHandle);
# 227 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_piso_shift_register_parallel_load(ShiftRegisterHandle shiftRegisterHandle);
# 237 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_piso_shift_register_shift(ShiftRegisterHandle shiftRegisterHandle);
# 251 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern bool avr_piso_shift_register_read_bit(ShiftRegisterHandle shiftRegisterHandle);
# 264 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern byte avr_piso_shift_register_read_byte(ShiftRegisterHandle shiftRegisterHandle);
# 291 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern ShiftRegisterHandle avr_sipo_shift_register_create(
    const DataPosition clockEnable,
    const DataPosition clockPulse,
    const DataPosition input,
    const DataPosition outputEnable,
    const DataPosition pushOutput,
    int waitTime
);
# 310 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_sipo_shift_register_init(ShiftRegisterHandle shiftRegisterHandle);






extern void avr_sipo_shift_register_destroy(ShiftRegisterHandle shiftRegisterHandle);
# 327 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_sipo_shift_register_shift(ShiftRegisterHandle shiftRegisterHandle);
# 341 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_sipo_shift_register_write_bit(ShiftRegisterHandle shiftRegisterHandle, byte data, int position);
# 354 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_sipo_shift_register_write_byte(ShiftRegisterHandle shiftRegisterHandle, byte data);
# 364 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_sipo_shift_register_enable_output(ShiftRegisterHandle shiftRegisterHandle);
# 374 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_sipo_shift_register_disable_output(ShiftRegisterHandle shiftRegisterHandle);
# 385 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_sipo_shift_register_push_data_to_output(ShiftRegisterHandle shiftRegisterHandle);
# 396 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/../src/sr/seduce.h"
extern void avr_sipo_shift_register_reset(ShiftRegisterHandle shiftRegisterHandle);
# 2 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/main.c" 2
# 1 "/usr/avr/include/util/delay.h" 1 3
# 44 "/usr/avr/include/util/delay.h" 3
# 1 "/usr/avr/include/inttypes.h" 1 3
# 37 "/usr/avr/include/inttypes.h" 3
# 1 "/usr/lib/gcc/avr/10.2.0/include/stdint.h" 1 3 4
# 9 "/usr/lib/gcc/avr/10.2.0/include/stdint.h" 3 4
# 1 "/usr/avr/include/stdint.h" 1 3 4
# 125 "/usr/avr/include/stdint.h" 3 4

# 125 "/usr/avr/include/stdint.h" 3 4
typedef signed int int8_t __attribute__((__mode__(__QI__)));
typedef unsigned int uint8_t __attribute__((__mode__(__QI__)));
typedef signed int int16_t __attribute__ ((__mode__ (__HI__)));
typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__)));
typedef signed int int32_t __attribute__ ((__mode__ (__SI__)));
typedef unsigned int uint32_t __attribute__ ((__mode__ (__SI__)));

typedef signed int int64_t __attribute__((__mode__(__DI__)));
typedef unsigned int uint64_t __attribute__((__mode__(__DI__)));
# 146 "/usr/avr/include/stdint.h" 3 4
typedef int16_t intptr_t;




typedef uint16_t uintptr_t;
# 163 "/usr/avr/include/stdint.h" 3 4
typedef int8_t int_least8_t;




typedef uint8_t uint_least8_t;




typedef int16_t int_least16_t;




typedef uint16_t uint_least16_t;




typedef int32_t int_least32_t;




typedef uint32_t uint_least32_t;







typedef int64_t int_least64_t;






typedef uint64_t uint_least64_t;
# 217 "/usr/avr/include/stdint.h" 3 4
typedef int8_t int_fast8_t;




typedef uint8_t uint_fast8_t;




typedef int16_t int_fast16_t;




typedef uint16_t uint_fast16_t;




typedef int32_t int_fast32_t;




typedef uint32_t uint_fast32_t;







typedef int64_t int_fast64_t;






typedef uint64_t uint_fast64_t;
# 277 "/usr/avr/include/stdint.h" 3 4
typedef int64_t intmax_t;




typedef uint64_t uintmax_t;
# 10 "/usr/lib/gcc/avr/10.2.0/include/stdint.h" 2 3 4
# 38 "/usr/avr/include/inttypes.h" 2 3
# 77 "/usr/avr/include/inttypes.h" 3
typedef int32_t int_farptr_t;



typedef uint32_t uint_farptr_t;
# 45 "/usr/avr/include/util/delay.h" 2 3
# 1 "/usr/avr/include/util/delay_basic.h" 1 3
# 40 "/usr/avr/include/util/delay_basic.h" 3
static __inline__ void _delay_loop_1(uint8_t __count) __attribute__((__always_inline__));
static __inline__ void _delay_loop_2(uint16_t __count) __attribute__((__always_inline__));
# 80 "/usr/avr/include/util/delay_basic.h" 3
void
_delay_loop_1(uint8_t __count)
{
 __asm__ volatile (
  "1: dec %0" "\n\t"
  "brne 1b"
  : "=r" (__count)
  : "0" (__count)
 );
}
# 102 "/usr/avr/include/util/delay_basic.h" 3
void
_delay_loop_2(uint16_t __count)
{
 __asm__ volatile (
  "1: sbiw %0,1" "\n\t"
  "brne 1b"
  : "=w" (__count)
  : "0" (__count)
 );
}
# 46 "/usr/avr/include/util/delay.h" 2 3
# 1 "/usr/avr/include/math.h" 1 3
# 127 "/usr/avr/include/math.h" 3
extern double cos(double __x) __attribute__((__const__));





extern double sin(double __x) __attribute__((__const__));





extern double tan(double __x) __attribute__((__const__));






extern double fabs(double __x) __attribute__((__const__));






extern double fmod(double __x, double __y) __attribute__((__const__));
# 168 "/usr/avr/include/math.h" 3
extern double modf(double __x, double *__iptr);


extern float modff (float __x, float *__iptr);




extern double sqrt(double __x) __attribute__((__const__));


extern float sqrtf (float) __attribute__((__const__));




extern double cbrt(double __x) __attribute__((__const__));
# 195 "/usr/avr/include/math.h" 3
extern double hypot (double __x, double __y) __attribute__((__const__));







extern double square(double __x) __attribute__((__const__));






extern double floor(double __x) __attribute__((__const__));






extern double ceil(double __x) __attribute__((__const__));
# 235 "/usr/avr/include/math.h" 3
extern double frexp(double __x, int *__pexp);







extern double ldexp(double __x, int __exp) __attribute__((__const__));





extern double exp(double __x) __attribute__((__const__));





extern double cosh(double __x) __attribute__((__const__));





extern double sinh(double __x) __attribute__((__const__));





extern double tanh(double __x) __attribute__((__const__));







extern double acos(double __x) __attribute__((__const__));







extern double asin(double __x) __attribute__((__const__));






extern double atan(double __x) __attribute__((__const__));
# 299 "/usr/avr/include/math.h" 3
extern double atan2(double __y, double __x) __attribute__((__const__));





extern double log(double __x) __attribute__((__const__));





extern double log10(double __x) __attribute__((__const__));





extern double pow(double __x, double __y) __attribute__((__const__));






extern int isnan(double __x) __attribute__((__const__));
# 334 "/usr/avr/include/math.h" 3
extern int isinf(double __x) __attribute__((__const__));






__attribute__((__const__)) static inline int isfinite (double __x)
{
    unsigned char __exp;
    __asm__ (
 "mov	%0, %C1		\n\t"
 "lsl	%0		\n\t"
 "mov	%0, %D1		\n\t"
 "rol	%0		"
 : "=r" (__exp)
 : "r" (__x) );
    return __exp != 0xff;
}






__attribute__((__const__)) static inline double copysign (double __x, double __y)
{
    __asm__ (
 "bst	%D2, 7	\n\t"
 "bld	%D0, 7	"
 : "=r" (__x)
 : "0" (__x), "r" (__y) );
    return __x;
}
# 377 "/usr/avr/include/math.h" 3
extern int signbit (double __x) __attribute__((__const__));






extern double fdim (double __x, double __y) __attribute__((__const__));
# 393 "/usr/avr/include/math.h" 3
extern double fma (double __x, double __y, double __z) __attribute__((__const__));







extern double fmax (double __x, double __y) __attribute__((__const__));







extern double fmin (double __x, double __y) __attribute__((__const__));






extern double trunc (double __x) __attribute__((__const__));
# 427 "/usr/avr/include/math.h" 3
extern double round (double __x) __attribute__((__const__));
# 440 "/usr/avr/include/math.h" 3
extern long lround (double __x) __attribute__((__const__));
# 454 "/usr/avr/include/math.h" 3
extern long lrint (double __x) __attribute__((__const__));
# 47 "/usr/avr/include/util/delay.h" 2 3
# 86 "/usr/avr/include/util/delay.h" 3
static __inline__ void _delay_us(double __us) __attribute__((__always_inline__));
static __inline__ void _delay_ms(double __ms) __attribute__((__always_inline__));
# 165 "/usr/avr/include/util/delay.h" 3
void
_delay_ms(double __ms)
{
 double __tmp ;
# 190 "/usr/avr/include/util/delay.h" 3
 uint16_t __ticks;
 __tmp = (() / 4e3) * __ms;
 if (__tmp < 1.0)
  __ticks = 1;
 else if (__tmp > 65535)
 {

  __ticks = (uint16_t) (__ms * 10.0);
  while(__ticks)
  {

   _delay_loop_2((() / 4e3) / 10);
   __ticks --;
  }
  return;
 }
 else
  __ticks = (uint16_t)__tmp;
 _delay_loop_2(__ticks);

}
# 254 "/usr/avr/include/util/delay.h" 3
void
_delay_us(double __us)
{
 double __tmp ;
# 279 "/usr/avr/include/util/delay.h" 3
 uint8_t __ticks;
 double __tmp2 ;
 __tmp = (() / 3e6) * __us;
 __tmp2 = (() / 4e6) * __us;
 if (__tmp < 1.0)
  __ticks = 1;
 else if (__tmp2 > 65535)
 {
  _delay_ms(__us / 1000.0);
 }
 else if (__tmp > 255)
 {
  uint16_t __ticks=(uint16_t)__tmp2;
  _delay_loop_2(__ticks);
  return;
 }
 else
  __ticks = (uint8_t)__tmp;
 _delay_loop_1(__ticks);

}
# 3 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/main.c" 2


# 4 "/home/ruther/Documents/MyProjects/MCU/avr-shift-registers/simavr/main.c"
int main(void)
{

    ShiftRegisterHandle sipoSrHandle = avr_sipo_shift_register_create(
        data_position_create(&DDRB, &PORTB, &PINB, 0),
        data_position_create(&DDRB, &PORTB, &PINB, 1),
        data_position_create(&DDRB, &PORTB, &PINB, 2),
        data_position_create(&DDRB, &PORTB, &PINB, 3),
        data_position_create(&DDRB, &PORTB, &PINB, 4),
        1
    );

    avr_sipo_shift_register_init(sipoSrHandle);

    avr_sipo_shift_register_write_byte(sipoSrHandle, 0b11001111);
    avr_sipo_shift_register_push_data_to_output(sipoSrHandle);
    avr_sipo_shift_register_enable_output(sipoSrHandle);



    _delay_ms(100);

    ShiftRegisterHandle pisoSrHandle = avr_piso_shift_register_create(
        data_position_create(&DDRC, &PORTC, &PINC, 0),
        data_position_create(&DDRC, &PORTC, &PINC, 1),
        data_position_create(&DDRC, &PORTC, &PINC, 2),
        data_position_create(&DDRC, &PORTC, &PINC, 3),
        1
    );

    avr_piso_shift_register_parallel_load();
    byte read = avr_piso_shift_register_read_byte();
}

M src/sr/CMakeLists.txt => src/sr/CMakeLists.txt +1 -1
@@ 1,5 1,5 @@
add_avr_library(
   avr-shift-registers
   avr_shift_registers
   util.c
   shift_register.c
   piso_shift_register.c

M src/sr/data_position.c => src/sr/data_position.c +2 -2
@@ 1,8 1,8 @@
#include "shift_register_internal.h"
#include <stdlib.h>

const DataPosition* data_position_create(volatile byte* ddr, volatile byte* port, volatile byte* pin, byte position) {
    DataPosition* dp = malloc(sizeof(DataPosition));
DataPosition* data_position_create(volatile byte* ddr, volatile byte* port, volatile byte* pin, byte position) {
    DataPosition* dp = (DataPosition*) malloc(sizeof(DataPosition));
    dp->ddr = ddr;
    dp->port = port;
    dp->pin = pin;

M src/sr/seduce.h => src/sr/seduce.h +2 -2
@@ 47,7 47,7 @@ typedef unsigned char byte;
 *  data_position_create(&DDRA, &PORTA, &PINA, 1); // Pass position 1 of PINA
 * @endcode
 */
typedef struct {
typedef struct DataPosition {
    volatile byte* ddr;
    volatile byte* port;
    volatile byte* pin;


@@ 64,7 64,7 @@ typedef struct {
 * @return DataPosition 
 * @note 0 is for LSB. 7 is for MSB. PORTA1 can be used.
 */
extern const DataPosition* data_position_create(volatile byte* ddr, volatile byte* port, volatile byte* pin, byte position);
extern DataPosition* data_position_create(volatile byte* ddr, volatile byte* port, volatile byte* pin, byte position);

/**
 * @brief Destroy DataPosition

M src/sr/sipo_shift_register.c => src/sr/sipo_shift_register.c +1 -1
@@ 11,7 11,7 @@ ShiftRegisterHandle avr_sipo_shift_register_create(
    int waitTime
)
{
    SipoShiftRegister* shiftRegister = (SipoShiftRegister*) calloc(1, sizeof(SipoShiftRegister));
    SipoShiftRegister* shiftRegister = (SipoShiftRegister*) malloc(sizeof(SipoShiftRegister));

    shiftRegister->input = input;
    shiftRegister->outputEnable = outputEnable;