<?xml version="1.0" encoding="utf-8"?>
<klayout-macro>
 <description>Load PDK options</description>
 <version/>
 <category/>
 <prolog/>
 <epilog/>
 <doc/>
 <autorun>false</autorun>
 <autorun-early>false</autorun-early>
 <shortcut/>
 <show-in-menu>true</show-in-menu>
 <group-name>Load PDK options</group-name>
 <menu-path>submenu&gt;end("gf180IC PDK").end</menu-path>
 <interpreter>ruby</interpreter>
 <dsl-interpreter-name/>
 <text>module MyMacro
 
  include RBA

  #####################################################################################
  # Loading options
  #####################################################################################
  mw = RBA::MainWindow::instance

  # create a toolbar submenu
  mw.menu.insert_menu("submenu.end", "drc_menu", "Klayout DRC Options")
  mw.menu.insert_menu("submenu.end", "lvs_menu", "Klayout LVS Options")
  #mw.menu.insert_separator("submenu.drc_menu.end", "name1")
  mw.menu.insert_separator("submenu.lvs_menu+", "name2")
  
  
  #####################################################################################
  # Adding DRC options
  #####################################################################################
  
  #0 Setting DRC mode
  drc_mode_action = RBA::Action::new
  drc_mode_action.title = "DRC type"
  drc_mode_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      drc_mode_select = RBA::InputDialog::ask_item("DRC modes options", "Select DRC mode:", [ "Antenna only", "Density only", "Antenna &amp; Density only", "Main only", "Main &amp; Antenna only", "Main &amp; Density only", "Main, Antenna &amp; Density" ], 3)
      if drc_mode_select == "Antenna only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180IC_antenna.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Density only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180IC_density.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Antenna &amp; Density only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180IC_antenna.drc\n# %include ../drc/gf180IC_density.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Main only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180IC.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Main &amp; Antenna only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180IC.drc\n# %include ../drc/gf180IC_antenna.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Main &amp; Density only" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180IC.drc\n# %include ../drc/gf180IC_density.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      elsif drc_mode_select == "Main, Antenna &amp; Density" 
        new_contents = text.gsub(/\# \%.*drc/m, "# %include ../drc/gf180IC.drc\n# %include ../drc/gf180IC_antenna.drc\n# %include ../drc/gf180IC_density.drc")
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "drc_mode", drc_mode_action)
  
  #1 Setting run mode
  run_mode_drc_action = RBA::Action::new
  run_mode_drc_action.title = "Run mode"
  run_mode_drc_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      run_mode_select = RBA::InputDialog::ask_item("Run mode", "Select run mode:", [ "tiling", "deep", "flat" ], 1)
      if run_mode_select 
        if text.include?("$run_mode")
          new_contents = text.gsub(/\$run_mode = \".*\"/, '$run_mode = "'+ run_mode_select + '"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*drc)/m, '$run_mode = "'+ run_mode_select +'"' +"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "run_mode", run_mode_drc_action)
  
  #2 Setting stack
  stack_drc_action = RBA::Action::new
  stack_drc_action.title = "Stack options"
  stack_drc_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      stack_select = RBA::InputDialog::ask_item("Stack options", "Select stack option:", [ "gf180ICA", "gf180ICB", "gf180ICC" ], 2)
      if stack_select == "gf180ICA" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "30K"'+"\n"+'$metal_level = "3LM"'+"\n"+'$mim_option = "A"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*drc)/m, '$metal_top = "30K"'+"\n"+'$metal_level = "3LM"'+"\n"+'$mim_option = "A"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      elsif stack_select == "gf180ICB" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "11K"'+"\n"+'$metal_level = "4LM"'+"\n"+'$mim_option = "B"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*drc)/m, '$metal_top = "11K"'+"\n"+'$metal_level = "4LM"'+"\n"+'$mim_option = "B"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      elsif stack_select == "gf180ICC" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "9K"'+"\n"+'$metal_level = "5LM"'+"\n"+'$mim_option = "B"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*drc)/m, '$metal_top = "9K"'+"\n"+'$metal_level = "5LM"'+"\n"+'$mim_option = "B"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "stack", stack_drc_action)
  
  #3 Setting verbose mode
  verbose_drc_action = RBA::Action::new
  verbose_drc_action.title = "Verbose mode"
  verbose_drc_action.checkable=(true)
  verbose_drc_action.checked=(false)
  verbose_drc_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if verbose_drc_action.is_checked?
        verbose_bool = "true"
      else
        verbose_bool = "false"
      end
      if text.include?("$verbose")
        new_contents = text.gsub(/\$verbose = \".*\"/, '$verbose = "'+ verbose_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$verbose = "'+ verbose_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "verbose", verbose_drc_action)
  
  #4 Setting FEOL rules
  feol_action = RBA::Action::new
  feol_action.title = "FEOL rules"
  feol_action.checkable=(true)
  feol_action.checked=(true)
  feol_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if feol_action.is_checked?
        feol_bool = "true"
      else
        feol_bool = "false"
      end
      if text.include?("$feol")
        new_contents = text.gsub(/\$feol = \".*\"/, '$feol = "'+ feol_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$feol = "'+ feol_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "feol", feol_action)
  
  #5 Setting BEOL rules
  beol_action = RBA::Action::new
  beol_action.title = "BEOL rules"
  beol_action.checkable=(true)
  beol_action.checked=(true)
  beol_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if beol_action.is_checked?
        beol_bool = "true"
      else
        beol_bool = "false"
      end
      if text.include?("$feol")
        new_contents = text.gsub(/\$beol = \".*\"/, '$beol = "'+ beol_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$beol = "'+ beol_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "beol", beol_action)
  
  #6 Setting offgrid rules
  offgrid_action = RBA::Action::new
  offgrid_action.title = "Offgrid rules"
  offgrid_action.checkable=(true)
  offgrid_action.checked=(true)
  offgrid_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if offgrid_action.is_checked?
        offgrid_bool = "true"
      else
        offgrid_bool = "false"
      end
      if text.include?("$offgrid")
        new_contents = text.gsub(/\$offgrid = \".*\"/, '$offgrid = "'+ offgrid_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$offgrid = "'+ offgrid_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "offgrid", offgrid_action)
  
  #7 Setting connectivity rules
  connectivity_action = RBA::Action::new
  connectivity_action.title = "Connectivity rules"
  connectivity_action.checkable=(true)
  connectivity_action.checked=(true)
  connectivity_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_drc.lydrc", 'w') { |f| 
      text = File.read(f)
      if connectivity_action.is_checked?
        connectivity_bool = "true"
      else
        connectivity_bool = "false"
      end
      if text.include?("$connectivity")
        new_contents = text.gsub(/\$connectivity = \".*\"/, '$connectivity = "'+ connectivity_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*drc)/m, '$connectivity = "'+ connectivity_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.drc_menu.end", "connectivity", connectivity_action)
  
  #####################################################################################
  # Adding LVS options
  #####################################################################################
  
  #1 Adding substrate name
  run_action = RBA::Action::new
  run_action.title = "Substrate name"
  run_action.on_triggered do
    sub_name = RBA::InputDialog::ask_string("Substrate name", "Please enter substrate name", "gf180IC_gnd")
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if sub_name 
        if text.include?("$lvs_sub")
          new_contents = text.gsub(/\$lvs_sub = \".*\"/, '$lvs_sub = "'+ sub_name + '"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$lvs_sub = "'+ sub_name +'"' +"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
    #system( "klayout -r #{File.expand_path File.dirname(__FILE__)}/sky130.lvs -rd input=#{RBA::CellView::active.filename}" )
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "SUB_name", run_action)
  
  #2 Setting run mode
  run_mode_action = RBA::Action::new
  run_mode_action.title = "Run mode"
  run_mode_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      run_mode_select = RBA::InputDialog::ask_item("Run mode", "Select run mode:", [ "tiling", "deep", "flat" ], 1)
      if run_mode_select 
        if text.include?("$run_mode")
          new_contents = text.gsub(/\$run_mode = \".*\"/, '$run_mode = "'+ run_mode_select + '"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$run_mode = "'+ run_mode_select +'"' +"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "run_mode", run_mode_action)
  
  #3 Setting stack
  stack_action = RBA::Action::new
  stack_action.title = "Stack options"
  stack_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      stack_select = RBA::InputDialog::ask_item("Stack options", "Select stack option:", [ "gf180ICA", "gf180ICB", "gf180ICC" ], 2)
      if stack_select == "gf180ICA" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "30K"'+"\n"+'$metal_level = "3LM"'+"\n"+'$mim_option = "A"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$metal_top = "30K"'+"\n"+'$metal_level = "3LM"'+"\n"+'$mim_option = "A"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      elsif stack_select == "gf180ICB" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "11K"'+"\n"+'$metal_level = "4LM"'+"\n"+'$mim_option = "B"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$metal_top = "11K"'+"\n"+'$metal_level = "4LM"'+"\n"+'$mim_option = "B"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      elsif stack_select == "gf180ICC" 
        if text.include?("$metal_top") &amp;&amp; text.include?("$metal_level") &amp;&amp; text.include?("$mim_option")
          new_contents = text.gsub(/\$metal_top = \".*\"\n\$metal_level = \".*\"\n\$mim_option = \".*\"/, '$metal_top = "9K"'+"\n"+'$metal_level = "5LM"'+"\n"+'$mim_option = "B"')
          File.open(f, "w") {|file| file.puts new_contents }
        else
          new_contents = text.gsub(/(\# \%.*lvs)/m, '$metal_top = "9K"'+"\n"+'$metal_level = "5LM"'+"\n"+'$mim_option = "B"'+"\n"+'\1')
          File.open(f, "w") {|file| file.puts new_contents }
        end
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "stack", stack_action)
  
  #4 Setting spice net names
  spice_net_action = RBA::Action::new
  spice_net_action.title = "SPICE net name"
  spice_net_action.checkable=(true)
  spice_net_action.checked=(true)
  spice_net_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if spice_net_action.is_checked?
        spice_net_bool = "true"
      else
        spice_net_bool = "false"
      end
      if text.include?("$spice_net_names")
        new_contents = text.gsub(/\$spice_net_names = \".*\"/, '$spice_net_names = "'+ spice_net_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$spice_net_names = "'+ spice_net_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "SPICE_net_name", spice_net_action)
  
  #5 Setting spice comments
  spice_comment_action = RBA::Action::new
  spice_comment_action.title = "SPICE comments"
  spice_comment_action.checkable=(true)
  spice_comment_action.checked=(false)
  spice_comment_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if spice_comment_action.is_checked?
        spice_comment_bool = "true"
      else
        spice_comment_bool = "false"
      end
      if text.include?("$spice_with_comments")
        new_contents = text.gsub(/\$spice_with_comments = \".*\"/, '$spice_with_comments = "'+ spice_comment_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$spice_with_comments = "'+ spice_comment_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "SPICE_comments", spice_comment_action)
  
  #6 Setting scaling
  scale_action = RBA::Action::new
  scale_action.title = "Scaling x10^6"
  scale_action.checkable=(true)
  scale_action.checked=(false)
  scale_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if scale_action.is_checked?
        scale_bool = "true"
      else
        scale_bool = "false"
      end
      if text.include?("$scale")
        new_contents = text.gsub(/\$scale = \".*\"/, '$scale = "'+ scale_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$scale = "'+ scale_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "scale", scale_action)
  
  #7 Setting verbose mode
  verbose_action = RBA::Action::new
  verbose_action.title = "Verbose mode"
  verbose_action.checkable=(true)
  verbose_action.checked=(false)
  verbose_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if verbose_action.is_checked?
        verbose_bool = "true"
      else
        verbose_bool = "false"
      end
      if text.include?("$verbose")
        new_contents = text.gsub(/\$verbose = \".*\"/, '$verbose = "'+ verbose_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$verbose = "'+ verbose_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "verbose", verbose_action)
  
  #8 Setting schematic simplification
  schematic_simple_action = RBA::Action::new
  schematic_simple_action.title = "Schematic simplify"
  schematic_simple_action.checkable=(true)
  schematic_simple_action.checked=(false)
  schematic_simple_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if schematic_simple_action.is_checked?
        schematic_simple_bool = "true"
      else
        schematic_simple_bool = "false"
      end
      if text.include?("$schematic_simplify")
        new_contents = text.gsub(/\$schematic_simplify = \".*\"/, '$schematic_simplify = "'+ schematic_simple_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$schematic_simplify = "'+ schematic_simple_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "schematic_simple", schematic_simple_action)
  
  #9 Setting netlist only
  net_only_action = RBA::Action::new
  net_only_action.title = "Netlist only"
  net_only_action.checkable=(true)
  net_only_action.checked=(false)
  net_only_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if net_only_action.is_checked?
        net_only_bool = "true"
      else
        net_only_bool = "false"
      end
      if text.include?("$net_only")
        new_contents = text.gsub(/\$net_only = \".*\"/, '$net_only = "'+ net_only_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$net_only = "'+ net_only_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "net_only", net_only_action)
  
  #10 Setting top level pins
  top_lvl_pins_action = RBA::Action::new
  top_lvl_pins_action.title = "Top level pins"
  top_lvl_pins_action.checkable=(true)
  top_lvl_pins_action.checked=(false)
  top_lvl_pins_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if top_lvl_pins_action.is_checked?
        top_lvl_pins_bool = "true"
      else
        top_lvl_pins_bool = "false"
      end
      if text.include?("$top_lvl_pins")
        new_contents = text.gsub(/\$top_lvl_pins = \".*\"/, '$top_lvl_pins = "'+ top_lvl_pins_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$top_lvl_pins = "'+ top_lvl_pins_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "top_lvl_pins", top_lvl_pins_action)
  
  #11 Setting device combine
  combine_action = RBA::Action::new
  combine_action.title = "Devices combine"
  combine_action.checkable=(true)
  combine_action.checked=(false)
  combine_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if combine_action.is_checked?
        combine_bool = "true"
      else
        combine_bool = "false"
      end
      if text.include?("$combine")
        new_contents = text.gsub(/\$combine = \".*\"/, '$combine = "'+ combine_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$combine = "'+ combine_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "combine", combine_action)
  
  #12 Setting purge
  purge_action = RBA::Action::new
  purge_action.title = "Purge"
  purge_action.checkable=(true)
  purge_action.checked=(false)
  purge_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if purge_action.is_checked?
        purge_bool = "true"
      else
        purge_bool = "false"
      end
      if text.include?("$verbose")
        new_contents = text.gsub(/\$purge = \".*\"/, '$purge = "'+ purge_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$purge = "'+ purge_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "purge", purge_action)
  
  #13 Setting purge nets
  purge_nets_action = RBA::Action::new
  purge_nets_action.title = "Purge nets"
  purge_nets_action.checkable=(true)
  purge_nets_action.checked=(false)
  purge_nets_action.on_triggered do
    File.open(File.expand_path File.dirname(__FILE__) + "/gf180IC_lvs.lylvs", 'w') { |f| 
      text = File.read(f)
      if purge_nets_action.is_checked?
        purge_nets_bool = "true"
      else
        purge_nets_bool = "false"
      end
      if text.include?("$purge_nets")
        new_contents = text.gsub(/\$purge_nets = \".*\"/, '$purge_nets = "'+ purge_nets_bool + '"')
        File.open(f, "w") {|file| file.puts new_contents }
      else
        new_contents = text.gsub(/(\# \%.*lvs)/m, '$purge_nets = "'+ purge_nets_bool +'"' +"\n"+'\1')
        File.open(f, "w") {|file| file.puts new_contents }
      end
    }
  end
  mw.menu.insert_item("submenu.lvs_menu.end", "purge_nets", purge_nets_action)
  
  
  #####################################################################################
  # Return to defaults on closing
  #####################################################################################
  
  mw.on_view_closed do
    str = '&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;klayout-macro&gt;
 &lt;description&gt;Run Klayout LVS&lt;/description&gt;
 &lt;version&gt;0.1&lt;/version&gt;
 &lt;category&gt;lvs&lt;/category&gt;
 &lt;prolog/&gt;
 &lt;epilog/&gt;
 &lt;doc/&gt;
 &lt;autorun&gt;false&lt;/autorun&gt;
 &lt;autorun-early&gt;false&lt;/autorun-early&gt;
 &lt;shortcut/&gt;
 &lt;show-in-menu&gt;true&lt;/show-in-menu&gt;
 &lt;group-name/&gt;
 &lt;menu-path&gt;submenu&amp;gt;end("gf180IC PDK").end&lt;/menu-path&gt;
 &lt;interpreter&gt;dsl&lt;/interpreter&gt;
 &lt;dsl-interpreter-name&gt;lvs-dsl-xml&lt;/dsl-interpreter-name&gt;
 &lt;text&gt;
# Copyright 2022 GlobalFoundries PDK Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

'
  str = str + "\n# %include ../lvs/gf180IC.lvs\n&lt;/text&gt;\n&lt;/klayout-macro&gt;"

  File.open(File.expand_path(File.dirname(__FILE__)) + "/gf180IC_lvs.lylvs", 'w') { |f| f.write(str) }
  
  str = '&lt;?xml version="1.0" encoding="utf-8"?&gt;
&lt;klayout-macro&gt;
 &lt;description&gt;Run Klayout DRC&lt;/description&gt;
 &lt;version&gt;0.1&lt;/version&gt;
 &lt;category&gt;drc&lt;/category&gt;
 &lt;prolog/&gt;
 &lt;epilog/&gt;
 &lt;doc/&gt;
 &lt;autorun&gt;false&lt;/autorun&gt;
 &lt;autorun-early&gt;false&lt;/autorun-early&gt;
 &lt;shortcut/&gt;
 &lt;show-in-menu&gt;true&lt;/show-in-menu&gt;
 &lt;group-name/&gt;
 &lt;menu-path&gt;submenu&amp;gt;end("gf180IC PDK").end&lt;/menu-path&gt;
 &lt;interpreter&gt;dsl&lt;/interpreter&gt;
 &lt;dsl-interpreter-name&gt;drc-dsl-xml&lt;/dsl-interpreter-name&gt;
 &lt;text&gt;
# Copyright 2022 GlobalFoundries PDK Authors
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

'
  str = str + "\n# %include ../drc/gf180IC.drc\n&lt;/text&gt;\n&lt;/klayout-macro&gt;"

  File.open(File.expand_path(File.dirname(__FILE__)) + "/gf180IC_drc.lydrc", 'w') { |f| f.write(str) }
  end

end


</text>
</klayout-macro>
