summaryrefslogtreecommitdiffstats
path: root/shift_class.h
diff options
context:
space:
mode:
Diffstat (limited to 'shift_class.h')
-rw-r--r--shift_class.h54
1 files changed, 54 insertions, 0 deletions
diff --git a/shift_class.h b/shift_class.h
new file mode 100644
index 0000000..be64c0f
--- /dev/null
+++ b/shift_class.h
@@ -0,0 +1,54 @@
+#ifndef __SHIFT_CLASS__
+#define __SHIFT_CLASS__
+
+template<typename dataType, int NUM_REGS>
+class shift_class{
+private:
+ dataType regs[NUM_REGS];
+ bool en;
+ bool sync_rst;
+ bool ld;
+ dataType *load_data;
+public:
+ shift_class():en(true),sync_rst(false),ld(false){}
+ shift_class(dataType din[NUM_REGS]):
+ en(true),sync_rst(false),ld(false){ load_data = din; }
+
+ void set_sync_rst(bool srst)
+ {
+ sync_rst = srst;
+ }
+
+ void load(bool load_in)
+ {
+ ld = load_in;
+ }
+
+ void set_enable(bool enable)
+ {
+ en = enable;
+ }
+
+ void operator << (dataType din)
+ {
+ SHIFT:for(int i=NUM_REGS-1;i>=0;i--){
+ if(en)
+ if(sync_rst)
+ regs[i] = 0;
+ else if(ld)
+ regs[i] = load_data[i];
+ else
+ if(i==0)
+ regs[i] = din;
+ else
+ regs[i] = regs[i-1];
+ }
+ }
+
+ dataType operator [](int i)
+ {
+ return regs[i];
+ }
+};
+
+#endif