From 504cfadc1becd76e632549acc53eeb523d64d3b7 Mon Sep 17 00:00:00 2001
From: snijder <snijder@astron.nl>
Date: Wed, 20 Jan 2021 15:45:05 +0100
Subject: [PATCH] Redid the generator

---
 .gitignore                      |   1 +
 YAML_files/LTS_RCU2L.yaml       | 272 +++++++++++++++++++++++
 YAML_files/LTS_RCU2_ADC.yaml    |  43 ++++
 YAML_files/LTS_RCU2_dither.yaml |  29 +++
 YAML_files/LTS_RCU2dig.yaml     | 212 ++++++++++++++++++
 YAML_files/LTS_clk.yaml         |  84 +++++++
 YAML_files/LTS_clkPLL.yaml      |  43 ++++
 YAML_files/LTS_pypcc.yaml       |   5 +
 YAML_files/LTS_switch.yaml      |  26 +++
 code_generator.py               |   0
 main.py                         | 155 +++++--------
 output_devices.csv              |  22 +-
 yaml_reader.py                  | 381 ++++++++++++++++++--------------
 13 files changed, 981 insertions(+), 292 deletions(-)
 create mode 100644 YAML_files/LTS_RCU2L.yaml
 create mode 100644 YAML_files/LTS_RCU2_ADC.yaml
 create mode 100644 YAML_files/LTS_RCU2_dither.yaml
 create mode 100644 YAML_files/LTS_RCU2dig.yaml
 create mode 100644 YAML_files/LTS_clk.yaml
 create mode 100644 YAML_files/LTS_clkPLL.yaml
 create mode 100644 YAML_files/LTS_pypcc.yaml
 create mode 100644 YAML_files/LTS_switch.yaml
 create mode 100644 code_generator.py

diff --git a/.gitignore b/.gitignore
index f9606a3..8093a02 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,2 @@
 /venv
+/output.py
diff --git a/YAML_files/LTS_RCU2L.yaml b/YAML_files/LTS_RCU2L.yaml
new file mode 100644
index 0000000..03ce804
--- /dev/null
+++ b/YAML_files/LTS_RCU2L.yaml
@@ -0,0 +1,272 @@
+dev_children:
+     - child_name: Dither3
+       child_dev : I2Cbitbang
+       child_conf: LTS_RCU2_dither
+       child_GPIO:
+         - SCL     : IO1.OUT1.6 
+         - SDO     : IO2.OUT2.3 
+         - SDI     : IO2.IN2.3  
+         - SDIOdir : IO2.CONF2.3
+     - child_name: Dither2
+       child_dev : I2Cbitbang
+       child_conf: LTS_RCU2_dither
+       child_GPIO:
+         - SCL     : IO1.OUT2.7 
+         - SDO     : IO1.OUT1.7 
+         - SDI     : IO1.IN1.7  
+         - SDIOdir : IO1.CONF1.7
+     - child_name: ADC1
+       child_dev : SPIbitbang1
+       child_conf: LTS_RCU2_ADC
+       child_GPIO:
+         - CLK     : IO3.OUT1.1 
+         - SDO     : IO3.OUT1.0 
+         - SDI     : IO3.IN1.0  
+         - SDIOdir: IO3.CONF1.0
+         - CS      : IO3.OUT2.0 
+     - child_name: ADC2
+       child_dev : SPIbitbang1
+       child_conf: LTS_RCU2_ADC
+       child_GPIO:
+         - CLK     : IO3.OUT1.3 
+         - SDO     : IO3.OUT1.2 
+         - SDI     : IO3.IN1.2  
+         - SDIOdir: IO3.CONF1.2
+         - CS      : IO3.OUT2.1 
+     - child_name: ADC3
+       child_dev : SPIbitbang1
+       child_conf: LTS_RCU2_ADC
+       child_GPIO:
+         - CLK     : IO3.OUT1.5 
+         - SDO     : IO3.OUT1.4 
+         - SDI     : IO3.IN1.4  
+         - SDIOdir: IO3.CONF1.4
+         - CS      : IO3.OUT2.2 
+
+#This is the I2C devices in the RCU
+I2C_devices:
+ - dev_name: IO1
+   dev_description: IO-Expander for filter selection
+   dev_address: 0x75
+   dev_device: TCA9539
+   dev_registers:
+   - reg_name: CONF1
+     reg_addr: 6
+   - reg_name: CONF2
+     reg_addr: 7
+   - reg_name: OUT1
+     reg_addr: 2
+     ref_default: 0
+   - reg_name: OUT2
+     reg_addr: 3
+     ref_default: 0
+   - reg_name: IN1
+     reg_addr: 0
+   - reg_name: IN2
+     reg_addr: 1
+
+ - dev_name: IO3
+   dev_description: IO-Expander for ADC control
+   dev_address: 0x20
+   dev_device: TCA6416
+   dev_registers:
+   - reg_name: CONF1
+     reg_description: Direction of IO pins 0..7
+     reg_addr: 6
+   - reg_name: CONF2
+     reg_description: Direction of IO pints 8..15
+     reg_addr: 7
+   - reg_name: IN1
+     reg_description: Ouput port register 0..7
+     reg_addr: 0
+   - reg_name: IN2
+     reg_description: Ouput port register 0..7
+     reg_addr: 1
+   - reg_name: OUT1
+     reg_description: Ouput port register 0..7
+     reg_addr: 2
+     reg_default: 0x0F
+   - reg_name: OUT2
+     reg_description: Ouput port register 8..15
+     reg_addr: 3
+     reg_default: 0x0F
+
+ - dev_name: IO2
+   dev_description: IO-Expander for ON/OFF, Band, BUFx2
+   dev_address: 0x76
+   dev_device: TCA9539
+   dev_registers:
+   - reg_name: CONF1
+     reg_addr: 6
+   - reg_name: CONF2
+     reg_addr: 7
+   - reg_name: OUT1
+     reg_addr: 2
+     ref_default: 0
+   - reg_name: OUT2
+     reg_addr: 3
+     ref_default: 0
+   - reg_name: IN1
+     reg_addr: 0
+   - reg_name: IN2
+     reg_addr: 1
+
+ - dev_name: UC
+   dev_description: RCU microcontroller 
+   dev_address: 0x40
+   dev_registers:
+   - reg_name: ID
+     reg_description: Device ID
+     reg_addr: 0
+
+ - dev_name: ROM
+   dev_description: EEPROM memory
+   dev_address: 0x53
+   dev_registers:
+   - reg_name: ctr_len
+     reg_description: Length of control data
+     reg_addr: 0
+   - reg_name: ctr_dat
+     reg_description: Control data (protocol buffers)
+     reg_addr: 2
+
+
+ - dev_name: AN
+   dev_description: Monitor ADC on RCU
+   dev_address: 0x14
+   dev_device: LTC2495
+   dev_registers:
+   - reg_name: Ch0
+     reg_addr: 0xB080
+   - reg_name: Ch1
+     reg_addr: 0xB8
+   - reg_name: Ch2
+     reg_addr: 0xB1
+   - reg_name: Ch3
+     reg_addr: 0xB9
+   - reg_name: Ch4
+     reg_addr: 0xB2
+   - reg_name: Ch5
+     reg_addr: 0xBA
+   - reg_name: Ch6
+     reg_addr: 0xB3
+   - reg_name: Ch7
+     reg_addr: 0xBB
+   - reg_name: Temp
+     reg_addr: 0xA0C0
+
+Variables:
+   - var_name: Attenuator1
+     var_dev:  IO1.OUT1
+     var_width: 5
+     var_max:  21
+     var_R/W:  RW
+   - var_name: Attenuator2
+     var_dev:  IO1.OUT2
+     var_width: 5
+     var_max:  21
+     var_R/W:  RW
+   - var_name: Attenuator3
+     var_dev:  IO2.OUT1
+     var_width: 5
+     var_max:  24
+     var_R/W:  RW
+
+   - var_name: Pwr_dig
+     var_description: Enable LDOs
+     var_dict: {0 : Off, 1 : On}
+     var_dev:  IO2.OUT1
+     var_width: 1
+     var_bitoffset: 6
+     var_R/W:  RO
+
+   - var_name: Band3
+     var_dev:  IO2.OUT2
+     var_dict: {0 : 10MHz, 1 : 30MHz}
+     var_width: 1
+     var_bitoffset: 0
+     var_R/W:  RW
+
+   - var_name: Band1
+     var_dev:  IO2.OUT2
+     var_dict: {0 : 10MHz, 1 : 30MHz}
+     var_width: 1
+     var_bitoffset: 1
+     var_R/W:  RW
+
+   - var_name: Band2
+     var_dev:  IO2.OUT2
+     var_dict: {0 : 10MHz, 1 : 30MHz}
+     var_width: 1
+     var_bitoffset: 4
+     var_R/W:  RW
+
+   - var_name: LED0
+     var_description: Front panel LEDs, 0=On
+     var_dict: {0 : Off, 1 : Yellow, 2: Red, 3: Orange}
+     var_dev:  IO2.OUT2
+     var_width: 2
+     var_bitoffset: 6
+     var_R/W:  RW
+
+   - var_name: Temperature
+     var_dev:  AN.Temp
+     var_width: 23
+     var_scale: 4.21e-3
+     var_R/W:  RO
+
+   - var_name: Dth3_Pwr
+     var_dev:  IO2.OUT2
+     var_width: 1
+     var_bitoffset: 2
+
+   - var_name: Dth2_Pwr
+     var_dev:  IO1.OUT2
+     var_width: 1
+     var_bitoffset: 6
+
+          
+Methods:
+   - method_name: RCU_on
+     registers:
+        - IO2.CONF1: [0]    #Setup IO expanders to output with default values
+        - IO2.OUT1: [0x4A]
+        - IO2.OUT2: [0x55]
+        - IO3.OUT1: [0x7f]
+        - IO3.OUT2: [0x47]
+        - IO1.OUT1: [0xCA]
+        - IO1.OUT2: [0xCA]
+        - IO2.CONF2: [0]
+        - IO3.CONF1: [0]
+        - IO3.CONF2: [0]
+        - IO1.CONF1: [0]
+        - IO1.CONF2: [0]
+        - ADC1_Setup: 1
+        - ADC2_Setup: 1
+        - ADC3_Setup: 1
+
+   - method_name: RCU_off
+     registers:
+        - IO2.OUT1: [0x00] #Switch all off
+        - IO2.OUT2: [0x00]
+        - IO3.OUT1: [0x00]
+        - IO3.OUT2: [0x00]
+        - IO1.OUT1: [0x00]
+        - IO1.OUT2: [0x00]
+
+   - method_name: Dither_on
+     method_invisible: 1
+     registers:
+        - Dth3_Pwr: [1]
+        - Dth2_Pwr: [1]
+        - Dither3_Setup: 1
+        - Dither2_Setup: 1
+
+   - method_name: Dither_off
+     method_invisible: 1
+     registers:
+        - Dth3_Pwr: [0]
+        - Dth2_Pwr: [0]
+
+
+
diff --git a/YAML_files/LTS_RCU2_ADC.yaml b/YAML_files/LTS_RCU2_ADC.yaml
new file mode 100644
index 0000000..a61c7f6
--- /dev/null
+++ b/YAML_files/LTS_RCU2_ADC.yaml
@@ -0,0 +1,43 @@
+I2C_devices:
+ - dev_name: ADC1
+   dev_description: I2C-SPI bridge to ADC
+   dev_device: AD9683
+   dev_registers:
+    - reg_name: PLL_stat
+      reg_description: PLL locked status
+      reg_addr: 0x0A
+    - reg_name: JESD_control1
+      reg_description: JESD link control, ILAS mode
+      reg_addr: 0x5F
+    - reg_name: CML_level
+      reg_description: CML output adjust
+      reg_addr: 0x15
+    - reg_name: SYNC_control
+      reg_description: SYNC / SYSREF control
+      reg_addr: 0x3A
+    - reg_name: Update
+      reg_description: Global device update
+      reg_addr: 0xFF
+
+Variables:
+   - var_name: locked
+     var_dev:  ADC1.PLL_stat
+     var_width: 8
+   - var_name: SYNC
+     var_dev:  ADC1.SYNC_control
+     var_width: 8
+   - var_name: CML
+     var_dev:  ADC1.CML_level
+     var_width: 8
+   - var_name: JESD
+     var_dev:  ADC1.JESD_control1
+     var_width: 8
+
+Methods:
+   - method_name: Setup
+     method_invisible: 1
+     registers:
+        - ADC1.JESD_control1: [14]  #Setup ADCs
+        - ADC1.SYNC_control: [1]  #Setup ADCs
+        - ADC1.CML_level: [0x7]
+        - ADC1.Update: [1]       #Needed to update ADC registers
diff --git a/YAML_files/LTS_RCU2_dither.yaml b/YAML_files/LTS_RCU2_dither.yaml
new file mode 100644
index 0000000..aa21250
--- /dev/null
+++ b/YAML_files/LTS_RCU2_dither.yaml
@@ -0,0 +1,29 @@
+I2C_devices:
+ - dev_name: DS1
+   dev_description: Dither Source, SI4010
+   dev_address: 0x70
+   dev_registers:
+   - reg_name: TX_Stop
+     reg_addr: 0x67
+   - reg_name: TX_Start
+     reg_addr: 0x62
+   - reg_name: property
+     reg_addr: 0x11
+   - reg_name: TX_FREQ
+     reg_addr: 0x1140
+
+Variables:
+   - var_name: Frequency
+     var_dev:  DS1.TX_FREQ
+     var_width: 32
+     var_scale: 1e-6
+     var_bitoffset: 0
+
+Methods:
+   - method_name: Setup
+     method_invisible: 1
+     registers:
+        - DS1.property: [0x60,1,0,0,0,125,127]     #Power level (1,0)
+        - DS1.property: [0x40,0x06,0x0c,0xc4,0x60] #Frequency 101.5MHz
+        - DS1.property: [0x21,0,0]     #tuning off
+        - DS1.TX_Start: [0,0,0,0,1]
diff --git a/YAML_files/LTS_RCU2dig.yaml b/YAML_files/LTS_RCU2dig.yaml
new file mode 100644
index 0000000..2f9c9ee
--- /dev/null
+++ b/YAML_files/LTS_RCU2dig.yaml
@@ -0,0 +1,212 @@
+dev_children:
+     - child_name: ADC1
+       child_dev : SPIbitbang1
+       child_conf: LTS_RCU2_ADC
+       child_GPIO:
+         - CLK     : IO3.OUT1.1 
+         - SDO     : IO3.OUT1.0 
+         - SDI     : IO3.IN1.0  
+         - SDIOdir: IO3.CONF1.0
+         - CS      : IO3.OUT2.0 
+     - child_name: ADC2
+       child_dev : SPIbitbang1
+       child_conf: LTS_RCU2_ADC
+       child_GPIO:
+         - CLK     : IO3.OUT1.3 
+         - SDO     : IO3.OUT1.2 
+         - SDI     : IO3.IN1.2  
+         - SDIOdir: IO3.CONF1.2
+         - CS      : IO3.OUT2.1 
+     - child_name: ADC3
+       child_dev : SPIbitbang1
+       child_conf: LTS_RCU2_ADC
+       child_GPIO:
+         - CLK     : IO3.OUT1.5 
+         - SDO     : IO3.OUT1.4 
+         - SDI     : IO3.IN1.4  
+         - SDIOdir: IO3.CONF1.4
+         - CS      : IO3.OUT2.2 
+
+#This is the I2C devices in the RCU
+I2C_devices:
+ - dev_name: IO1
+   dev_description: IO-Expander for filter selection
+   dev_address: 0x75
+   dev_device: TCA9539
+   dev_registers:
+   - reg_name: CONF1
+     reg_addr: 6
+   - reg_name: CONF2
+     reg_addr: 7
+   - reg_name: OUT1
+     reg_addr: 2
+     ref_default: 0
+   - reg_name: OUT2
+     reg_addr: 3
+     ref_default: 0
+   - reg_name: IN1
+     reg_addr: 0
+   - reg_name: IN2
+     reg_addr: 1
+
+ - dev_name: IO3
+   dev_description: IO-Expander for ADC control
+   dev_address: 0x20
+   dev_device: TCA6416
+   dev_registers:
+   - reg_name: CONF1
+     reg_description: Direction of IO pins 0..7
+     reg_addr: 6
+   - reg_name: CONF2
+     reg_description: Direction of IO pints 8..15
+     reg_addr: 7
+   - reg_name: IN1
+     reg_description: Ouput port register 0..7
+     reg_addr: 0
+   - reg_name: IN2
+     reg_description: Ouput port register 0..7
+     reg_addr: 1
+   - reg_name: OUT1
+     reg_description: Ouput port register 0..7
+     reg_addr: 2
+     reg_default: 0x0F
+   - reg_name: OUT2
+     reg_description: Ouput port register 8..15
+     reg_addr: 3
+     reg_default: 0x0F
+
+ - dev_name: IO2
+   dev_description: IO-Expander for ON/OFF, Band, BUFx2
+   dev_address: 0x76
+   dev_device: TCA9539
+   dev_registers:
+   - reg_name: CONF1
+     reg_addr: 6
+   - reg_name: CONF2
+     reg_addr: 7
+   - reg_name: OUT1
+     reg_addr: 2
+     ref_default: 0
+   - reg_name: OUT2
+     reg_addr: 3
+     ref_default: 0
+   - reg_name: IN1
+     reg_addr: 0
+   - reg_name: IN2
+     reg_addr: 1
+
+ - dev_name: UC
+   dev_description: RCU microcontroller 
+   dev_address: 0x40
+   dev_registers:
+   - reg_name: ID
+     reg_description: Device ID
+     reg_addr: 0
+
+ - dev_name: ROM
+   dev_description: EEPROM memory
+   dev_address: 0x53
+   dev_registers:
+   - reg_name: ctr_len
+     reg_description: Length of control data
+     reg_addr: 0
+   - reg_name: ctr_dat
+     reg_description: Control data (protocol buffers)
+     reg_addr: 2
+
+
+ - dev_name: AN
+   dev_description: Monitor ADC on RCU
+   dev_address: 0x14
+   dev_device: LTC2495
+   dev_registers:
+   - reg_name: Ch0
+     reg_addr: 0xB080
+   - reg_name: Ch1
+     reg_addr: 0xB8
+   - reg_name: Ch2
+     reg_addr: 0xB1
+   - reg_name: Ch3
+     reg_addr: 0xB9
+   - reg_name: Ch4
+     reg_addr: 0xB2
+   - reg_name: Ch5
+     reg_addr: 0xBA
+   - reg_name: Ch6
+     reg_addr: 0xB3
+   - reg_name: Ch7
+     reg_addr: 0xBB
+   - reg_name: Temp
+     reg_addr: 0xA0C0
+
+Variables:
+   - var_name: Attenuator1
+     var_dev:  IO1.OUT1
+     var_width: 5
+     var_max:  21
+     var_R/W:  RW
+   - var_name: Attenuator2
+     var_dev:  IO1.OUT2
+     var_width: 5
+     var_max:  21
+     var_R/W:  RW
+   - var_name: Attenuator3
+     var_dev:  IO2.OUT1
+     var_width: 5
+     var_max:  24
+     var_R/W:  RW
+
+   - var_name: Pwr_dig
+     var_description: Enable LDOs
+     var_dict: {0 : Off, 1 : On}
+     var_dev:  IO2.OUT1
+     var_width: 1
+     var_bitoffset: 6
+     var_R/W:  RO
+
+   - var_name: LED0
+     var_description: Front panel LEDs, 0=On
+     var_dict: {0 : Off, 1 : Yellow, 2: Red, 3: Orange}
+     var_dev:  IO2.OUT2
+     var_width: 2
+     var_bitoffset: 6
+     var_R/W:  RW
+
+   - var_name: Temperature
+     var_dev:  AN.Temp
+     var_width: 23
+     var_scale: 4.21e-3
+     var_R/W:  RO
+
+
+          
+Methods:
+   - method_name: RCU_on
+     registers:
+        - IO2.CONF1: [0]    #Setup IO expanders to output with default values
+        - IO2.OUT1: [0x4A]
+        - IO2.OUT2: [0x55]
+        - IO3.OUT1: [0x7f]
+        - IO3.OUT2: [0x47]
+        - IO1.OUT1: [0xCA]
+        - IO1.OUT2: [0xCA]
+        - IO2.CONF2: [0]
+        - IO3.CONF1: [0]
+        - IO3.CONF2: [0]
+        - IO1.CONF1: [0]
+        - IO1.CONF2: [0]
+        - ADC1_Setup: 1
+        - ADC2_Setup: 1
+        - ADC3_Setup: 1
+
+   - method_name: RCU_off
+     registers:
+        - IO2.OUT1: [0x00] #Switch all off
+        - IO2.OUT2: [0x00]
+        - IO3.OUT1: [0x00]
+        - IO3.OUT2: [0x00]
+        - IO1.OUT1: [0x00]
+        - IO1.OUT2: [0x00]
+
+
+
diff --git a/YAML_files/LTS_clk.yaml b/YAML_files/LTS_clk.yaml
new file mode 100644
index 0000000..58ae764
--- /dev/null
+++ b/YAML_files/LTS_clk.yaml
@@ -0,0 +1,84 @@
+dev_children:
+     - child_name: PLL
+       child_dev : SPIbitbang2
+       child_conf: LTS_clkPLL
+       child_GPIO:
+         - CLK     : IO3.OUT1.4
+         - SDO     : IO3.IN1.5
+         - SDI     : IO3.OUT1.7
+         - CS      : IO3.OUT1.6
+
+#This is the I2C devices in the RCU
+I2C_devices:
+ - dev_name: IO3
+   dev_description: IO-Expander
+   dev_address: 0x20
+   dev_device: TCA6416
+   dev_registers:
+   - reg_name: CONF1
+     reg_addr: 6
+   - reg_name: CONF2
+     reg_addr: 7
+   - reg_name: IN1
+     reg_addr: 0
+   - reg_name: IN2
+     reg_addr: 1
+   - reg_name: OUT1
+     reg_addr: 2
+     reg_default: 0x0F
+   - reg_name: OUT2
+     reg_addr: 3
+     reg_default: 0x0F
+
+Variables:
+   - var_name: IGNORE_PPS
+     var_dev:  IO3.OUT1
+     var_width: 1
+     var_bitoffset: 6
+#     var_R/W:  RW
+
+   - var_name: ENABLE_PWR
+     var_dev:  IO3.OUT1
+     var_width: 1
+     var_bitoffset: 7
+#     var_R/W:  RW
+
+   - var_name: STAT1
+     var_dev:  IO3.OUT1
+     var_width: 1
+     var_bitoffset: 4
+#     var_R/W:  RO
+
+#  - var_name: STAT2
+#     var_dev:  IO3.OUT1
+#     var_width: 1
+#     var_bitoffset: 5
+#     var_R/W:  RO
+
+   - var_name: CONF
+     var_dev:  IO3.CONF1
+     var_width: 8
+
+   - var_name: OUT
+     var_dev:  IO3.OUT1
+     var_width: 8
+
+   - var_name: IN
+     var_dev:  IO3.IN1
+     var_width: 8
+
+          
+Methods:
+   - method_name: on1
+     registers:
+        - IO3.CONF1: [0x2C]
+        - IO3.OUT1: [0x42]     
+   - method_name: off1
+     method_invisible: 1
+     registers:
+        - IO3.CONF1: [0x2C]
+        - IO3.OUT1: [0x40] 
+
+#Output High=SDI(x2), PPS (0x40)  #Read 0x42, 
+# IN=0x46: High: SDI, CLK, Enable_PWR
+
diff --git a/YAML_files/LTS_clkPLL.yaml b/YAML_files/LTS_clkPLL.yaml
new file mode 100644
index 0000000..c6e99bb
--- /dev/null
+++ b/YAML_files/LTS_clkPLL.yaml
@@ -0,0 +1,43 @@
+I2C_devices:
+ - dev_name: PLL1
+   dev_description: I2C-SPI bridge to PLL
+   dev_device: LTC6950
+   dev_registers:
+    - reg_name: a0
+      reg_addr: 0x00
+
+Variables:
+   - var_name: locked
+     var_dev:  PLL1.a0
+     var_R/W:  RO
+     var_width: 23
+
+Methods:
+   - method_name: Power_off
+     method_invisible: 1
+     registers:
+        - PLL1.3: [0x88] 
+   - method_name: Power_on
+     method_invisible: 1
+     registers:
+        - PLL1.3: [0x08] 
+   - method_name: Reset
+     method_invisible: 1
+     registers:
+        - PLL1.3: [0x0C] 
+   - method_name: Setup
+     method_invisible: 1
+     registers:
+        - PLL1.3: [0x08] 
+        - PLL1.5: [0x97] 
+        - PLL1.6: [0x10] 
+        - PLL1.7: [0x04] 
+        - PLL1.8: [0x01] 
+        - PLL1.7: [0x00] 
+        - PLL1.9: [0x10] 
+        - PLL1.10: [0x14] #0x0A
+        - PLL1.9: [0x00] 
+        - PLL1.13: [0x01] #0x0D 
+        - PLL1.15: [0x01] #0x0F
+        - PLL1.17: [0x01] #0x11
+        - PLL1.19: [0x01] #0x13
diff --git a/YAML_files/LTS_pypcc.yaml b/YAML_files/LTS_pypcc.yaml
new file mode 100644
index 0000000..98536bc
--- /dev/null
+++ b/YAML_files/LTS_pypcc.yaml
@@ -0,0 +1,5 @@
+dev_name: PCC_I2C
+dev_children:
+     - child_dev : I2Cswitch
+       child_conf: LTS_switch
+       child_addr: 1 #I2C port on raspberry pi
diff --git a/YAML_files/LTS_switch.yaml b/YAML_files/LTS_switch.yaml
new file mode 100644
index 0000000..eec8a39
--- /dev/null
+++ b/YAML_files/LTS_switch.yaml
@@ -0,0 +1,26 @@
+dev_name: Switch1
+dev_address: 0x70 
+dev_device: TCA9548
+# LTS midplane: I2C 0-5 = RCU 0-5, I2C 6 = UNB2_N0, I2C 7 = UNB2
+dev_children:
+     - child_name: RCU01
+       child_dev: I2Cdevices
+       child_conf:  LTS_RCU2L
+       child_addr: 1
+     - child_name: RCU02
+       child_dev: I2Cdevices
+       child_conf:  LTS_RCU2L
+       child_addr: 2
+     - child_name: RCU03
+       child_dev: I2Cdevices
+       child_conf:  LTS_RCU2L
+       child_addr: 3
+     - child_name: CLK
+       child_dev: I2Cdevices
+       child_conf:  LTS_clk
+       child_addr: 7
+
+dev_groups: #Must have the same config!
+ - group_name: RCUs
+   group_members: [RCU01,RCU02,RCU03]
+#   group_members: [RCU01]
diff --git a/code_generator.py b/code_generator.py
new file mode 100644
index 0000000..e69de29
diff --git a/main.py b/main.py
index d635ea9..c91f4db 100644
--- a/main.py
+++ b/main.py
@@ -1,131 +1,82 @@
-import yaml_reader
 
-from opcua import ua, uamethod, Server
 
 
+from yaml_reader import *
+
+from opcua import ua, uamethod, Server
+
 import sys
 import time
 import logging
 
-import numpy
-from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt
-from tango.server import Device, attribute, command, pipe, device_property
-
-
-class real_values:
-    access_incrementer = 0
-
-
-class mock_device(Device):
-    voltage = attribute(label="Voltage", dtype="float", display_level=DispLevel.OPERATOR,
-                        access=AttrWriteType.READ, unit="V", format="8.4f", doc="The power supply voltage")
-
-    current = attribute(label="Current", dtype="float", display_level=DispLevel.EXPERT,
-                        access=AttrWriteType.READ_WRITE, unit="A", format="8.4f",
-                        min_value=0.0, max_value=8.4, min_alarm=0.1, max_alarm=8.4,
-                        min_warning=0.5, max_warning=8.0, fget="get_current", fset="set_current", doc="The power supply current")
-
-    noise = attribute(label="Noise",
-                      dtype=((int,),),
-                      max_dim_x=1024, max_dim_y=1024)
-
-    info = pipe(label='Info')
-
-    host = device_property(dtype=str)
-    port = device_property(dtype=int, default_value=9788)
-
-
-    def init_device(self):
-        Device.init_device(self)
-        self.__current = 0.0
-        self.set_state(DevState.STANDBY)
-
-    def read_voltage(self):
-        self.info_stream("read_voltage(%s, %d)", self.host, self.port)
-        return 9.99, time.time(), AttrQuality.ATTR_WARNING
-
-    def get_current(self):
-        return self.__current
-
-    def set_current(self, current):
-        # should set the power supply current
-        self.__current = current
-
-    def read_info(self):
-        return 'Information', dict(manufacturer='Tango',
-                                   model='PS2000',
-                                   version_number=123)
+# import numpy
+# from tango import AttrQuality, AttrWriteType, DispLevel, DevState, DebugIt
+# from tango.server import Device, attribute, command, pipe, device_property
 
-    @DebugIt()
-    def read_noise(self):
-        return numpy.random.random_integers(1000, size=(100, 100))
+write_data = "test"
 
-    @command
-    def TurnOn(self):
-        # turn on the actual power supply here
-        self.set_state(DevState.ON)
+class device_template:
+	"""
+	List of all useful attributes
+	"""
 
-    @command
-    def TurnOff(self):
-        # turn off the actual power supply here
-        self.set_state(DevState.OFF)
+	def __init__(self):
+		pass
 
-    @command(dtype_in=float, doc_in="Ramp target current",
-             dtype_out=bool, doc_out="True if ramping went well, "
-             "False otherwise")
-    def Ramp(self, target_current):
-        # should do the ramping
-        return True
+	def create_device_XMI(self, device):
+		template = f"""   
+		<attributes name="{device.name}_{device.RW}" attType="Scalar" rwType="{device.RW}" displayLevel="OPERATOR" polledPeriod="{device.polling_period}" maxX="" maxY="" allocReadMember="true" isDynamic="false">
+		<dataType xsi:type="pogoDsl:{device.dtype}"/>
+		<changeEvent fire="false" libCheckCriteria="false"/>
+		<archiveEvent fire="false" libCheckCriteria="false"/>
+		<dataReadyEvent fire="false" libCheckCriteria="true"/>
+		<status abstract="false" inherited="false" concrete="true" concreteHere="true"/>
+		<properties description="{device.description}" label="{device.label}" unit="{device.unit}" standardUnit="{device.standard_unit}" 
+				displayUnit="{device.display_unit}" format="" maxValue="{device.max}" minValue="{device.min}" maxAlarm="{device.max_alarm}" 
+				minAlarm="{device.min_alarm}" maxWarning="{device.max_warn}" minWarning="{device.min_warn}" {device.deltaTime}="" {device.deltaValue}=""/>
+		</attributes>
+		"""
+		return template
 
 
-def get_real_data():
-    real_values.access_incrementer += 1
-    return real_values.access_incrementer
+class device_instance:
+	def __init__(self, attr_key):
+		self.attribute_mapping = {}
+		self.attribute_key = attr_key
 
 
-def add_monitor_point(device, node):
-    write_val = int(get_real_data())
-    node = obj.add_variable(idx, i.name, value)
-    print("Added: {}, description: {}".format(i.name, i.description))
-    OPC_nodes.append(node)
+	def read_func_R(self):
+		"""Return the LED_R attribute."""
 
+		self.read_value = self.attribute_mapping["LED_R"].get_value()
+		return self.read_value
 
-def add_control_point(device, node):
-    pass
+	def read_func_RW(self):
 
+		"""Return the LED_RW attribute."""
+		self.read_RW = self.attribute_mapping["LED_RW"].get_value()
+		return self.read_RW
 
-class mock_server:
-    def __init__(self):
-        # gonna move the server here
-        pass
+	# PROTECTED REGION END #    //  RCUSCC.LED_RW_read
 
+	def write_func_RW(self, value):
+		# PROTECTED REGION ID(RCUSCC.LED_RW_write) ENABLED START #
+		"""Set the LED_RW attribute."""
+		self.attribute_mapping["LED_RW"].set_value(value)
+		self.write_value_RW = value
+	# PROTECTED REGION END #    //  RCUSCC.LED_RW_write
 
-logging.basicConfig(level=logging.WARNING)  # INFO ERROR WARNING NOTSET DEBUG
 
-# setup our server
-server = Server()
-server.set_endpoint("opc.tcp://192.168.178.17:4840/lofar/server/")
+class generator:
 
-# setup our own namespace, not really necessary but should as spec
-uri = "http://lofar.eu"
-idx = server.register_namespace(uri)
+	def __init__(self):
+		self.the_data = yaml_reader()
+		self.the_data.start_read()
+		self.the_data.group_groups()
 
-# get Objects node, this is where we should put our custom stuff
-obj = server.get_objects_node()
+stuff = generator()
 
-OPC_nodes = []
 
-for i in yaml_reader.device_list:
-    print("name: {}, description: {}".format(i.name, i.description))
-    value = int(get_real_data())
-    var_node = obj.add_variable(idx, i.name, value)
-    OPC_nodes.append(var_node)
 
-# starting!
-server.start()
 
-for i in OPC_nodes:
-    print(i.get_browse_name(), ": ", i.get_value())
 
-while 1:
-    time.sleep(0.1)
\ No newline at end of file
diff --git a/output_devices.csv b/output_devices.csv
index 3d5d459..42f891a 100644
--- a/output_devices.csv
+++ b/output_devices.csv
@@ -1,21 +1 @@
-name, description, RW, max, min, scale, width
-"Att_0","Gain of ADC0","W","24","None","None","5"
-"Att_1","Gain of ADC0","W","24","None","None","5"
-"Att_2","Gain of ADC0","W","24","None","None","5"
-"Pwr_dig_0","Enable LDOs","W","None","None","None","1"
-"Pwr_dig_1","Enable LDOs","W","None","None","None","1"
-"Pwr_dig_2","Enable LDOs","W","None","None","None","1"
-"Pwr_Ant_0","Switch power of Antenna 1","W","None","None","None","1"
-"Pwr_Ant_1","Switch power of Antenna 1","W","None","None","None","1"
-"Pwr_Ant_2","Switch power of Antenna 1","W","None","None","None","1"
-"Band_0","10/30MHz band select","W","None","None","None","2"
-"Band_1","10/30MHz band select","W","None","None","None","2"
-"Band_2","10/30MHz band select","W","None","None","None","2"
-"LED_0","LEDs on PCB","W","None","None","None","1"
-"LED_1","LEDs on PCB","W","None","None","None","1"
-"ADC_lock_0","Check ADC lock and JESD link ready","R","None","None","None","8"
-"ADC_lock_1","Check ADC lock and JESD link ready","R","None","None","None","8"
-"ADC_lock_2","Check ADC lock and JESD link ready","R","None","None","None","8"
-"V_2v5_0","2.5V on PCB","R","None","None","1.97e-07","24"
-"V_2v5_1","2.5V on PCB","R","None","None","1.97e-07","24"
-"V_2v5_2","2.5V on PCB","R","None","None","1.97e-07","24"
+"RCU01","Frequency","None","RW","None","None","1e-6""RCU01","Frequency","None","RW","None","None","1e-6""RCU01","locked","None","RW","None","None","None""RCU01","SYNC","None","RW","None","None","None""RCU01","CML","None","RW","None","None","None""RCU01","JESD","None","RW","None","None","None""RCU01","locked","None","RW","None","None","None""RCU01","SYNC","None","RW","None","None","None""RCU01","CML","None","RW","None","None","None""RCU01","JESD","None","RW","None","None","None""RCU01","locked","None","RW","None","None","None""RCU01","SYNC","None","RW","None","None","None""RCU01","CML","None","RW","None","None","None""RCU01","JESD","None","RW","None","None","None""RCU01","Attenuator1","None","RW","21","None","None""RCU01","Attenuator2","None","RW","21","None","None""RCU01","Attenuator3","None","RW","24","None","None""RCU01","Pwr_dig","Enable LDOs","RO","None","None","None""RCU01","Band3","None","RW","None","None","None""RCU01","Band1","None","RW","None","None","None""RCU01","Band2","None","RW","None","None","None""RCU01","LED0","Front panel LEDs, 0=On","RW","None","None","None""RCU01","Temperature","None","RO","None","None","0.00421""RCU01","Dth3_Pwr","None","RW","None","None","None""RCU01","Dth2_Pwr","None","RW","None","None","None""RCU02","Frequency","None","RW","None","None","1e-6""RCU02","Frequency","None","RW","None","None","1e-6""RCU02","locked","None","RW","None","None","None""RCU02","SYNC","None","RW","None","None","None""RCU02","CML","None","RW","None","None","None""RCU02","JESD","None","RW","None","None","None""RCU02","locked","None","RW","None","None","None""RCU02","SYNC","None","RW","None","None","None""RCU02","CML","None","RW","None","None","None""RCU02","JESD","None","RW","None","None","None""RCU02","locked","None","RW","None","None","None""RCU02","SYNC","None","RW","None","None","None""RCU02","CML","None","RW","None","None","None""RCU02","JESD","None","RW","None","None","None""RCU02","Attenuator1","None","RW","21","None","None""RCU02","Attenuator2","None","RW","21","None","None""RCU02","Attenuator3","None","RW","24","None","None""RCU02","Pwr_dig","Enable LDOs","RO","None","None","None""RCU02","Band3","None","RW","None","None","None""RCU02","Band1","None","RW","None","None","None""RCU02","Band2","None","RW","None","None","None""RCU02","LED0","Front panel LEDs, 0=On","RW","None","None","None""RCU02","Temperature","None","RO","None","None","0.00421""RCU02","Dth3_Pwr","None","RW","None","None","None""RCU02","Dth2_Pwr","None","RW","None","None","None""RCU03","Frequency","None","RW","None","None","1e-6""RCU03","Frequency","None","RW","None","None","1e-6""RCU03","locked","None","RW","None","None","None""RCU03","SYNC","None","RW","None","None","None""RCU03","CML","None","RW","None","None","None""RCU03","JESD","None","RW","None","None","None""RCU03","locked","None","RW","None","None","None""RCU03","SYNC","None","RW","None","None","None""RCU03","CML","None","RW","None","None","None""RCU03","JESD","None","RW","None","None","None""RCU03","locked","None","RW","None","None","None""RCU03","SYNC","None","RW","None","None","None""RCU03","CML","None","RW","None","None","None""RCU03","JESD","None","RW","None","None","None""RCU03","Attenuator1","None","RW","21","None","None""RCU03","Attenuator2","None","RW","21","None","None""RCU03","Attenuator3","None","RW","24","None","None""RCU03","Pwr_dig","Enable LDOs","RO","None","None","None""RCU03","Band3","None","RW","None","None","None""RCU03","Band1","None","RW","None","None","None""RCU03","Band2","None","RW","None","None","None""RCU03","LED0","Front panel LEDs, 0=On","RW","None","None","None""RCU03","Temperature","None","RO","None","None","0.00421""RCU03","Dth3_Pwr","None","RW","None","None","None""RCU03","Dth2_Pwr","None","RW","None","None","None""CLK","locked","None","RO","None","None","None""CLK","IGNORE_PPS","None","RW","None","None","None""CLK","ENABLE_PWR","None","RW","None","None","None""CLK","STAT1","None","RW","None","None","None""CLK","CONF","None","RW","None","None","None""CLK","OUT","None","RW","None","None","None""CLK","IN","None","RW","None","None","None"
\ No newline at end of file
diff --git a/yaml_reader.py b/yaml_reader.py
index 5a6425e..365f27c 100644
--- a/yaml_reader.py
+++ b/yaml_reader.py
@@ -1,171 +1,214 @@
 import yaml
 
-"""
-var_name: The name of a device 
-var_description: description
-var_number: the number of instances
-var_max: maximum values for each instance
-var_min: minimum value of each instance
-var_RW:  read / write attributes
-
-
-
-   - var_name: Att
-     var_description: Gain of ADC0
-     var_number: 3
-     var_dev:  [IO1.OUT1,IO1.OUT2,IO2.OUT1]
-     var_width: 5
-     var_max:  [21,21,24]
-     var_R/W:  W
-
-"""
-
-
-class var_Param:
-    var_name = "var_name"  # Required
-    var_description = "var_description"  # Optional and maybe unnececary
-    var_number = "var_number"  # not in the device itself, but how many device instances there are
-    var_max = "var_max"  # optional max value
-    var_min = "var_min"  # optional max value
-    var_RW = "var_R/W"  # optional, no mention is assumed R only
-    var_bitoffset = "var_bitoffset"  # not interesting at this level
-    var_width = "var_width"  # used to determine the datatype currently (subject to change)
-    var_scale = "var_scale"  # used to determine the datatype currently (subject to change)
-
-
-class yaml_generated_device:
-    def __init__(self, name="", description="", RW="R", maxval=None, minval=None, scale=None, width=None):
-        self.name = name
-        self.description = description
-        self.RW = RW
-        self.max = maxval
-        self.min = minval
-        self.scale = scale
-        self.width = width
-
-    def device_copy(self, old_device):
-        self.name = old_device.name
-        self.description = old_device.description
-        self.RW = old_device.RW
-        self.max = old_device.max
-        self.min = old_device.min
-        self.scale = old_device.scale
-        self.width = old_device.width
-
-
-def add_depth(depth):
-    for i in range(depth):
-        print("\t", end="")
-
-
-class explorer:
-    def __init__(self):
-        self.device_list = []
-        self.nof_devices = 0
-
-        self.current_device = None  # create an empty device for temporarily holding data
-        self.current_Device_instances = 1  # some devices need to be instantiated more than once
-
-    def log_data(self):
-        file = open("output_devices.csv", "w")
-
-        file.write("name, description, RW, max, min, scale, width\n")
-
-        for i in self.device_list:
-            file.write("\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\"\n".format(i.name, i.description, i.RW, i.max, i.min, i.scale, i.width))
-
-        file.close()
-
-    def new_device(self):
-        #  add the device or devices to the list
-        if self.current_device is None:
-            return
-
-        if self.current_Device_instances != 0:
-            self.current_device.name += "_x"
-            for i in range(self.current_Device_instances):
-                self.device_list.append(yaml_generated_device())
-                self.device_list[-1].device_copy(self.current_device)
-                self.device_list[-1].name = self.current_device.name[:-1] + str(i)
-        else:
-            self.device_list.append(yaml_generated_device())
-            self.device_list[-1].device_copy(self.current_device)
-
-    def add_device_data(self, param, data):
-        # if the data is "var_name" a new device has begun,
-        if param == var_Param.var_name:
-            # add the current device to the device list
-            self.new_device()
-
-            # reset the current device to its default
-            self.current_device = yaml_generated_device()
-            self.current_device.name = data
-        # add the other parameters
-        if param == var_Param.var_RW:
-            self.current_device.RW = data
-        if param == var_Param.var_description:
-            self.current_device.description = data
-        if param == var_Param.var_max:
-            self.current_device.max = data
-        if param == var_Param.var_min:
-            self.current_device.min = data
-        if param == var_Param.var_scale:
-            self.current_device.scale = data
-        if param == var_Param.var_width:
-            self.current_device.width = data
-        # store the amount of instances to create
-        if param == var_Param.var_number:
-            self.current_Device_instances = data
-
-    def explore_list(self, data, name, depth):
-        print("")
-        add_depth(depth)
-        print("[")
-        for i in data:
-            self.explore(i, name, depth, True)
-
-        add_depth(depth)
-        print("]")
-
-    def explore_dict(self, data, name, depth):
-        for k, v in data.items():
-            add_depth(depth)
-            print(k, "-> ", end="")
-            self.explore(v, str(k), depth)
-
-    def explore(self, data, name, depth, has_depth=False):
-        add_depth(depth)
-
-        self.add_device_data(name, data)
-        #
-        # print("\t>>>\tName: {}".format(name))
-
-        if isinstance(data, list):
-            self.explore_list(data, name, depth)
-        elif isinstance(data, dict):
-            self.explore_dict(data, name, depth + 1)
-        else:
-            if has_depth:
-                add_depth(depth + 1)
-            print(data)
-
-    def start_explore(self):
-        with open('control_I2C.yaml') as f:
-            yaml_data = yaml.load_all(f, Loader=yaml.FullLoader)
-            depth = 0
-            # explore(yaml_data, depth)
-
-            for i in yaml_data:
-                depth = 0
-
-                Items = i.items()
-                for k, v in Items:
-                    sub_data = yaml.load(str(v), Loader=yaml.FullLoader)
-                    print(k)
-                    self.explore(sub_data, str(k), depth)
-
-            self.log_data()
-            return self.device_list
-
-
-device_list = explorer().start_explore()
+class device_template:
+	"""
+	List of all useful attributes
+	"""
+
+	def __init__(self, data, board=""):
+		for k, v in data.items():
+			print("{}: {}".format(k, v))
+
+		self.instances = 1
+
+		self.name = "{}".format(data["var_name"]) 	# Required
+		self.description = None
+		self.RW = "RW" 		#TODO: currently assumes that no R/RW attribute means RW by default
+		self.max = None
+		self.min = None
+		self.scale = None
+		self.dtype = None
+		self.min_alarm = None
+		self.max_alarm = None
+		self.min_warn = None
+		self.max_warn = None
+		self.label = None
+		self.display_unit = None
+		self.unit = None
+		self.standard_unit = None
+		self.format = None
+		self.polling_period = 0
+		self.deltaTime = None
+		self.deltaValue = None
+		self.max_dim_x = 1
+		self.max_dim_x = 1
+		self.set_func = None	 # "write_func_RW"
+		self.get_func = None	 # "read_func_R" or "read_func_RW"
+
+		self.board = board
+		self.group = ""
+		self.group_nr = -1
+
+		if "var_description" in data:
+			self.description = data["var_description"]
+		if "var_max" in data:
+			self.max = data["var_max"]
+		if "var_min" in data:
+			self.min = data["var_min"]
+		if "var_R/W" in data:
+			self.RW = data["var_R/W"]
+
+		#available types and their names: https://pytango.readthedocs.io/en/stable/server_api/server.html#module-tango.server
+		if "var_width" in data:
+			if int(data["var_width"]) != 1:
+				# self.width = data["var_width"]
+				if "var_scale" in data:
+					self.dtype = 'double'
+					self.scale = data["var_scale"]
+				else:
+					self.dtype = 'int64'
+			else:
+				self.dtype = 'bool'
+		else:
+			self.dtype = 'int64'
+
+class method_template:
+	def __init__(self, method_name, board):
+		self.name = method_name
+		self.board = board
+
+class yaml_reader:
+	# these 3 parameters are of interest for finding the sub files.
+	dev_child_param = "dev_children"  # indicates the items below are sub files.
+	child_name = "child_name"  # name of the group
+	child_file_name = "child_conf"  # name of the file ( does not contain file extension)
+	variable_param = "Variables"
+	method_param = "Methods"
+	group_param = "dev_groups"
+
+	def __init__(self) -> object:
+
+		self.current_file = ""
+		self.previous_file = []
+
+		self.current_device = ""
+
+		self.variable_list = []
+		self.method_list = []
+
+		# same as above but ordered in groups
+		self.board_list = []
+		self.groups = []
+		self.variables_grouped = []
+		self.methods_grouped = []
+
+	def add_method(self, data):
+		if "method_invisible" in data:
+			# we dont care about invisible methods, they don't exist I THINK????
+			return
+		else:
+			self.method_list.append(method_template(data["method_name"], self.current_device))
+
+	def start_read(self):
+		self.read_file("YAML_files/LTS_pypcc.yaml")
+		self.group_boards()
+		self.group_groups()
+		self.log_groups()
+
+
+
+	def read_file(self, file):
+		if len(self.current_file) != "":
+			self.previous_file.append(self.current_file)
+		self.current_file = file
+
+		with open(file) as f:
+			yaml_data = yaml.load_all(f, Loader=yaml.FullLoader)
+
+			for i in yaml_data:
+				self.reading(i)
+		self.current_file = self.previous_file[-1]
+		self.previous_file.pop(-1)
+
+	def reading(self, data, param=""):
+
+
+		if isinstance(data, list):
+			for i in data:
+				self.reading(i, param)
+
+		elif isinstance(data, dict):
+			for k, v in data.items():
+				self.reading(v, k)
+			self.catch_param(param, data)
+		else:
+			self.catch_param(param, data)
+
+
+	def log_data(self):
+		file = open("output_devices.csv", "w")
+
+		for i in self.variable_list:
+			text = "\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\"".format(i.board, i.name, i.description, i.RW, i.max, i.min, i.scale, i.dtype)
+			print(text)
+			file.write(text)
+
+		for i in self.method_list:
+			print("method: {}, {}".format(i.board, i.name))
+
+
+	def log_groups(self):
+		for i in range(len(self.board_list)):
+			print(">>>\t", self.board_list[i])
+
+			for j in self.variables_grouped[i]:
+				text = "\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\",\"{}\"".format(j.board, j.name, j.description, j.RW, j.max, j.min, j.scale, j.dtype)
+				print("\t", text)
+
+	def group_boards(self):
+		for i in self.variable_list:
+			if not i.board in self.board_list:
+				print("addding {}".format(i.board))
+				self.board_list.append(i.board)
+				self.variables_grouped.append([])
+
+			for j in range(len(self.board_list)):
+				if i.board == self.board_list[j]:
+					self.variables_grouped[j].append(i)
+
+	def group_groups(self):
+		print(self.groups)
+		for i in self.groups:
+			for j in self.board_list:
+				if j in i:
+					print(i, j)
+
+
+	def compare_lists(self, lst1, lst2):
+		matches = 0
+
+		for i in lst1:
+			if i in lst2:
+				matches += 1
+
+	def catch_param(self, key, data):
+		# print("{}:".format(key), data)
+
+		key = str(key)
+
+		if key.find(self.dev_child_param) != -1:
+			print("{}:".format(key), data, " - there are sub files that I should open")
+			file_name = "YAML_files/{}.yaml".format(dict(data)["child_conf"])
+			print("opening: ", file_name)
+
+
+			if self.current_file.find("switch") != -1:
+				print("\t >>>\t", data)
+				self.current_device = data["child_name"]
+
+			self.read_file(file_name)
+
+		elif key.find(self.method_param) != -1:
+			print("{}:".format(key), data, " I should probably generate methods from this")
+			self.add_method(data)
+		elif key.find(self.variable_param) != -1:
+			print("{}:".format(key), data, " there are variable items below this")
+			dev = device_template(data, self.current_device)
+			self.variable_list.append(dev)
+		elif key.find(self.method_param) != -1:
+			print("{}:".format(key), data, " I should probably generate methods from this")
+		elif key.find(self.group_param) != -1:
+			print("{}:".format(key), data["group_members"], " these boards need to be grouped")
+			self.groups.append(data["group_members"])
+		else:
+			pass
-- 
GitLab