From 81462284ed49fec9d4addbb3539a46e62aaffc54 Mon Sep 17 00:00:00 2001
From: Matthias Koefferlein <matthias@koefferlein.de>
Date: Sat, 28 Oct 2017 21:12:40 +0200
Subject: [PATCH] Added tests to import_tf package.

---
 macros/import_tf.lym           |   9 +-
 macros/import_tf_standalone.rb |  11 +-
 ruby/import_tf.rb              |  21 ++-
 ruby/testdata_1/default.drf    | 323 +++++++++++++++++++++++++++++++++
 ruby/testdata_1/techfile.tf    | 140 ++++++++++++++
 ruby/testdata_2/default.drf    | 323 +++++++++++++++++++++++++++++++++
 ruby/testdata_2/techfile.tf    |  96 ++++++++++
 ruby/testdata_2/test.layermap  |  28 +++
 ruby/tests.rb                  | 155 ++++++++++++++++
 9 files changed, 1081 insertions(+), 25 deletions(-)
 create mode 100755 ruby/testdata_1/default.drf
 create mode 100755 ruby/testdata_1/techfile.tf
 create mode 100755 ruby/testdata_2/default.drf
 create mode 100755 ruby/testdata_2/techfile.tf
 create mode 100644 ruby/testdata_2/test.layermap
 create mode 100644 ruby/tests.rb

diff --git a/macros/import_tf.lym b/macros/import_tf.lym
index 8b06d65..d4a8aa0 100644
--- a/macros/import_tf.lym
+++ b/macros/import_tf.lym
@@ -15,15 +15,10 @@
  <interpreter>ruby</interpreter>
  <dsl-interpreter-name/>
  <text>#
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# LICENSE file for details.
 #
 # DESCRIPTION: Cadence techfile import for KLayout.
 #
diff --git a/macros/import_tf_standalone.rb b/macros/import_tf_standalone.rb
index d4f8f68..fadeee8 100644
--- a/macros/import_tf_standalone.rb
+++ b/macros/import_tf_standalone.rb
@@ -1,16 +1,11 @@
 # $autorun
 #
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# LICENSE file for details.
 #
-# DESCRIPTION: Cadence techfile converter for KLayout.
+# DESCRIPTION: Cadence techfile converter for KLayout - batch mode interface
 #
 # Run the script with
 #   klayout -z -rd tf_file=[input] -rd lyp_file=[output] -r import_tf_standalone.lym ...
diff --git a/ruby/import_tf.rb b/ruby/import_tf.rb
index 93fbe43..a14b720 100644
--- a/ruby/import_tf.rb
+++ b/ruby/import_tf.rb
@@ -1,15 +1,10 @@
 #
-# This program is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 2 of the License, or
-# (at your option) any later version.
-#
 # This program is distributed in the hope that it will be useful,
 # but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# LICENSE file for details.
 #
-# DESCRIPTION: Cadence techfile import for KLayout.
+# DESCRIPTION: Cadence techfile import for KLayout - core functionality.
 #
 
 module TechfileToKLayout
@@ -23,6 +18,7 @@ def initialize(_packet)
       frame_color = 0x808080
       fill_color = 0x808080
       width = 1
+      xfill = false
     end
   
     attr_reader :packet
@@ -31,6 +27,7 @@ def initialize(_packet)
     attr_accessor :frame_color
     attr_accessor :fill_color
     attr_accessor :width
+    attr_accessor :xfill
   
   end
   
@@ -218,7 +215,7 @@ def self.import_techfile(lv, tf_file)
         if sname == "drDefinePacket"
           section.each do |defs|
             if defs.length >= 6
-              packets[defs[1]] ||= [ defs[2], defs[3], defs[4], defs[5] ]
+              packets[defs[1]] ||= [ defs[2], defs[3], defs[4], defs[5], defs[6] ]
             end
           end
         elsif sname == "drDefineLineStyle"
@@ -261,9 +258,10 @@ def self.import_techfile(lv, tf_file)
       packets.each do |k,v|
 
         stipple = stipples[v[0]]
-        line_style = line_styles[v[0]]
+        line_style = line_styles[v[1]]
         fill_color = colors[v[2]]
         frame_color = colors[v[3]]
+        xfill = v[4].to_s == "X"
         width = widths[v[1]]
         width ||= 0
 
@@ -273,6 +271,7 @@ def self.import_techfile(lv, tf_file)
           dd.line_style = line_style
           dd.fill_color = fill_color
           dd.frame_color = frame_color
+          dd.xfill = xfill
           dd.width = width
         end
 
@@ -380,6 +379,8 @@ def self.import_techfile(lv, tf_file)
         lprops.frame_color = ldef.display.frame_color
         lprops.fill_color = ldef.display.fill_color
         lprops.visible = ldef.visible
+        lprops.valid = ldef.valid
+        lprops.xfill = ldef.display.xfill
         lprops.dither_pattern = ldef.display.stipple || 1
         lprops.line_style = ldef.display.line_style || 0
         lv.insert_layer(lv.end_layers, lprops)
diff --git a/ruby/testdata_1/default.drf b/ruby/testdata_1/default.drf
new file mode 100755
index 0000000..fe758e5
--- /dev/null
+++ b/ruby/testdata_1/default.drf
@@ -0,0 +1,323 @@
+drDefineDisplay(
+;( DisplayName )
+ ( display       )
+)
+drDefineColor(
+;( DisplayName   ColorsName   Red      Green    Blue     )
+ ( display       white        255      255      255      )
+ ( display       yellow       255      255      0        )
+ ( display       silver       217      230      255      )
+ ( display       cream        255      255      204      )
+ ( display       pink         255      191      242      )
+ ( display       magenta      255      0        255      )
+ ( display       lime         0        255      0        )
+ ( display       tan          255      230      191      )
+ ( display       cyan         0        255      255      )
+ ( display       cadetBlue    57       191      255      )
+ ( display       orange       227      139      0        )
+ ( display       red          255      0        0        )
+ ( display       purple       153      0        230      )
+ ( display       green        0        204      102      )
+ ( display       brown        191      64       38       )
+ ( display       blue         0        0        255      )
+ ( display       slate        140      140      166      )
+ ( display       gold         217      204      0        )
+ ( display       maroon       230      31       13       )
+ ( display       violet       94       0        230      )
+ ( display       forest       38       140      107      )
+ ( display       chocolate    128      38       38       )
+ ( display       navy         51       51       153      )
+ ( display       black        0        0        0        )
+ ( display       gray         204      204      217      )
+ ( display       winColor1    166      166      166      )
+ ( display       winColor2    115      115      115      )
+ ( display       winColor3    189      204      204      )
+ ( display       winColor4    204      204      204      )
+ ( display       winColor5    199      199      199      )
+ ( display       blinkRed     255      0        0        t )
+ ( display       blinkYellow  255      255      0        t )
+ ( display       blinkWhite   255      255      255      t )
+)
+drDefineStipple(
+;( DisplayName   StippleName  Bitmap     )
+ ( display       dots         ( ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  ) ) )
+ ( display       dots1        ( ( 1 0 1 0  )
+                                ( 0 1 0 1  )
+                                ( 1 0 1 0  )
+                                ( 0 1 0 1  ) ) )
+ ( display       hLine        ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  ) ) )
+ ( display       vLine        ( ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  ) ) )
+ ( display       cross        ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  ) ) )
+ ( display       grid         ( ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  ) ) )
+ ( display       slash        ( ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  ) ) )
+ ( display       backSlash    ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  ) ) )
+ ( display       hZigZag      ( ( 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1  )
+                                ( 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0  )
+                                ( 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0  )
+                                ( 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1  )
+                                ( 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0  )
+                                ( 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0  )
+                                ( 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0  )
+                                ( 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0  )
+                                ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1  ) ) )
+ ( display       vZigZag      ( ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0  )
+                                ( 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0  )
+                                ( 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0  )
+                                ( 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1  )
+                                ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0  )
+                                ( 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0  )
+                                ( 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0  )
+                                ( 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1  ) ) )
+ ( display       hCurb        ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  ) ) )
+ ( display       vCurb        ( ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0  ) ) )
+ ( display       brick        ( ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  ) ) )
+ ( display       dagger       ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  ) ) )
+ ( display       triangle     ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0  )
+                                ( 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  ) ) )
+ ( display       x            ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  ) ) )
+)
+drDefineLineStyle(
+;( DisplayName   LineStyle    Size       Pattern   )
+ ( display       solid        1          (1 1 1 ) )
+ ( display       dashed       1          (1 1 1 1 0 0 ) )
+ ( display       dots         1          (1 0 0 ) )
+ ( display       dashDot      1          (1 1 1 0 0 1 0 0 ) )
+ ( display       shortDash    1          (1 1 0 0 ) )
+ ( display       doubleDash   1          (1 1 1 1 0 0 1 1 0 0 ) )
+ ( display       hidden       1          (1 0 0 0 ) )
+ ( display       thickLine    3          (1 1 1 ) )
+ ( display       thickDots    3          (1 0 0 ) )
+)
+drDefinePacket(
+;( DisplayName  PacketName           Stipple    LineStyle  Fill       Outline    [FillStyle])
+ ( display      AA                   dots       thickDots  winColor4  winColor4  outlineStipple)
+ ( display      C1                   blank      thickLine  purple     purple     X         )
+ ( display      M1                   dots       solid      forest     forest     outlineStipple)
+ ( display      NBL                  x          dashed     silver     silver     outlineStipple)
+ ( display      NHV                  slash      dashDots   cadetBlue  cadetBlue  outlineStipple)
+ ( display      NP                   dots       shortDash  navy       navy       outlineStipple)
+ ( display      NW                   dots       doubleDash cadetBlue  cadetBlue  outlineStipple)
+ ( display      P1                   dots1      solid      orange     orange     outlineStipple)
+ ( display      P2                   blank      solid      brown      brown      solid     )
+ ( display      PA                   brick      solid      slate      slate      outlineStipple)
+ ( display      PBL                  triangle   solid      pink       pink       outlineStipple)
+ ( display      PHV                  vZigZag    solid      orange     orange     outlineStipple)
+ ( display      PP                   dots       solid      chocolate  chocolate  outlineStipple)
+ ( display      PTOP                 slash      solid      maroon     maroon     outlineStipple)
+ ( display      PW                   slash      solid      brown      brown      outlineStipple)
+ ( display      SP                   backSlash  solid      brown      brown      outlineStipple)
+ ( display      VTH                  hLine      solid      orange     orange     outlineStipple)
+ ( display      P1net                dots1      hidden     orange     white      outlineStipple)
+ ( display      P2net                blank      hidden     brown      white      outlineStipple)
+ ( display      C1net                blank      hidden     purple     white      X         )
+ ( display      M1net                dots       hidden     forest     white      outlineStipple)
+)
diff --git a/ruby/testdata_1/techfile.tf b/ruby/testdata_1/techfile.tf
new file mode 100755
index 0000000..8bd2188
--- /dev/null
+++ b/ruby/testdata_1/techfile.tf
@@ -0,0 +1,140 @@
+
+;********************************
+; LAYER DEFINITION
+;********************************
+layerDefinitions(
+
+ techPurposes(
+ ;( PurposeName               Purpose#   Abbreviation )
+ ;( -----------               --------   ------------ )
+  ( drawing                   252        drw          )
+  ( net                       253        net          )
+ ) ;techPurposes
+
+ techLayers(
+ ;( LayerName                 Layer#     Abbreviation )
+ ;( ---------                 ------     ------------ )
+ ;User-Defined Layers:
+  ( PW                        1          PW           )
+  ( NBL                       2          NBL          )
+  ( SP                        3          SP           )
+  ( PBL                       6          PBL          )
+  ( C1                        9          C1           )
+  ( M1                        10         M1           )
+  ( PA                        11         PA           )
+  ( NW                        12         NW           )
+  ( NHV                       23         NHV          )
+  ( PHV                       24         PHV          )
+  ( PTOP                      25         PTOP         )
+  ( P1                        30         P1           )
+  ( P2                        31         P2           )
+  ( AA                        54         AA           )
+  ( VTH                       91         VTH          )
+  ( PP                        97         PP           )
+  ( NP                        98         NP           )
+ ) ;techLayers
+
+ techLayerPurposePriorities(
+ ;layers are ordered from lowest to highest priority
+ ;( LayerName                 Purpose    )
+ ;( ---------                 -------    )
+  ( NBL                       drawing    )
+  ( PBL                       drawing    )
+  ( PW                        drawing    )
+  ( NW                        drawing    )
+  ( PTOP                      drawing    )
+  ( AA                        drawing    )
+  ( VTH                       drawing    )
+  ( P1                        drawing    )
+  ( NHV                       drawing    )
+  ( PHV                       drawing    )
+  ( SP                        drawing    )
+  ( P2                        drawing    )
+  ( NP                        drawing    )
+  ( PP                        drawing    )
+  ( C1                        drawing    )
+  ( M1                        drawing    )
+  ( PA                        drawing    )
+  ( P1                        net        )
+  ( P2                        net        )
+  ( C1                        net        )
+  ( M1                        net        )
+ ) ;techLayerPurposePriorities
+
+ techDisplays(
+ ;( LayerName    Purpose      Packet          Vis Sel Con2ChgLy DrgEnbl Valid )
+ ;( ---------    -------      ------          --- --- --------- ------- ----- )
+  ( NBL          drawing      NBL              t t t t t )
+  ( PBL          drawing      PBL              t t t t t )
+  ( PW           drawing      PW               t t t t t )
+  ( NW           drawing      NW               t t t t t )
+  ( PTOP         drawing      PTOP             t t t t t )
+  ( AA           drawing      AA               t t t t t )
+  ( VTH          drawing      VTH              t t t t t )
+  ( P1           drawing      P1               t t t t t )
+  ( NHV          drawing      NHV              t t t t t )
+  ( PHV          drawing      PHV              t t t t t )
+  ( SP           drawing      SP               t t t t t )
+  ( P2           drawing      P2               t t t t t )
+  ( NP           drawing      NP               t t t t t )
+  ( PP           drawing      PP               t t t t t )
+  ( C1           drawing      C1               t t t t t )
+  ( M1           drawing      M1               t t t t t )
+  ( PA           drawing      PA               t t t t t )
+  ( P1           net          P1net            t t t t nil )
+  ( P2           net          P2net            t t t t nil )
+  ( C1           net          C1net            t t t t nil )
+  ( M1           net          M1net            t t t t nil )
+ ) ;techDisplays
+
+techLayerProperties(
+;( PropName               Layer1 [ Layer2 ]            PropValue )
+)
+
+) ;layerDefinitions
+
+
+;********************************
+; LAYER RULES
+;********************************
+layerRules(
+
+ streamLayers(
+ ;( layer       streamNumber    dataType        translate )
+ ;( -----       ------------    --------        --------- )
+  ( ("NBL" "drawing")	2         	0       	t	 )
+  ( ("PBL" "drawing")	6         	0       	t	 )
+  ( ("PW" "drawing")	1         	0       	t	 )
+  ( ("NW" "drawing")	12        	0       	t	 )
+  ( ("PTOP" "drawing")	25        	0       	t	 )
+  ( ("AA" "drawing")	54        	0       	t	 )
+  ( ("VTH" "drawing")	91        	0       	t	 )
+  ( ("P1" "drawing")	30        	0       	t	 )
+  ( ("NHV" "drawing")	23        	0       	t	 )
+  ( ("PHV" "drawing")	24        	0       	t	 )
+  ( ("SP" "drawing")	3         	0       	t	 )
+  ( ("P2" "drawing")	31        	0       	t	 )
+  ( ("NP" "drawing")	98        	0       	t	 )
+  ( ("PP" "drawing")	97        	0       	t	 )
+  ( ("C1" "drawing")	9         	0       	t	 )
+  ( ("M1" "drawing")	10        	0       	t	 )
+  ( ("PA" "drawing")	11        	0       	t	 )
+  ( ("P2" "net")	101       	0       	t	 )
+  ( ("P1" "net")	102       	0       	t	 )
+  ( ("M1" "net")	103       	0       	t	 )
+  ( ("C1" "net")	104       	0       	t	 )
+ ) ;streamLayers
+
+) ;layerRules
+
+
+;********************************
+; PHYSICAL RULES
+;********************************
+physicalRules(
+
+ mfgGridResolution(
+      ( 0.001000 )
+ ) ;mfgGridResolution
+
+) ;physicalRules
diff --git a/ruby/testdata_2/default.drf b/ruby/testdata_2/default.drf
new file mode 100755
index 0000000..fe758e5
--- /dev/null
+++ b/ruby/testdata_2/default.drf
@@ -0,0 +1,323 @@
+drDefineDisplay(
+;( DisplayName )
+ ( display       )
+)
+drDefineColor(
+;( DisplayName   ColorsName   Red      Green    Blue     )
+ ( display       white        255      255      255      )
+ ( display       yellow       255      255      0        )
+ ( display       silver       217      230      255      )
+ ( display       cream        255      255      204      )
+ ( display       pink         255      191      242      )
+ ( display       magenta      255      0        255      )
+ ( display       lime         0        255      0        )
+ ( display       tan          255      230      191      )
+ ( display       cyan         0        255      255      )
+ ( display       cadetBlue    57       191      255      )
+ ( display       orange       227      139      0        )
+ ( display       red          255      0        0        )
+ ( display       purple       153      0        230      )
+ ( display       green        0        204      102      )
+ ( display       brown        191      64       38       )
+ ( display       blue         0        0        255      )
+ ( display       slate        140      140      166      )
+ ( display       gold         217      204      0        )
+ ( display       maroon       230      31       13       )
+ ( display       violet       94       0        230      )
+ ( display       forest       38       140      107      )
+ ( display       chocolate    128      38       38       )
+ ( display       navy         51       51       153      )
+ ( display       black        0        0        0        )
+ ( display       gray         204      204      217      )
+ ( display       winColor1    166      166      166      )
+ ( display       winColor2    115      115      115      )
+ ( display       winColor3    189      204      204      )
+ ( display       winColor4    204      204      204      )
+ ( display       winColor5    199      199      199      )
+ ( display       blinkRed     255      0        0        t )
+ ( display       blinkYellow  255      255      0        t )
+ ( display       blinkWhite   255      255      255      t )
+)
+drDefineStipple(
+;( DisplayName   StippleName  Bitmap     )
+ ( display       dots         ( ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  ) ) )
+ ( display       dots1        ( ( 1 0 1 0  )
+                                ( 0 1 0 1  )
+                                ( 1 0 1 0  )
+                                ( 0 1 0 1  ) ) )
+ ( display       hLine        ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  ) ) )
+ ( display       vLine        ( ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  ) ) )
+ ( display       cross        ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  ) ) )
+ ( display       grid         ( ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  ) ) )
+ ( display       slash        ( ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  ) ) )
+ ( display       backSlash    ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  ) ) )
+ ( display       hZigZag      ( ( 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1  )
+                                ( 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0  )
+                                ( 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 0  )
+                                ( 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0  )
+                                ( 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 1 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1  )
+                                ( 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0  )
+                                ( 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0  )
+                                ( 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0  )
+                                ( 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0  )
+                                ( 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1  ) ) )
+ ( display       vZigZag      ( ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0  )
+                                ( 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0  )
+                                ( 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0  )
+                                ( 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1  )
+                                ( 1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0  )
+                                ( 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0  )
+                                ( 0 0 0 1 0 0 0 0 1 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0  )
+                                ( 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 1  ) ) )
+ ( display       hCurb        ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1  )
+                                ( 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  ) ) )
+ ( display       vCurb        ( ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 1 1 1 0 0 0 0 1 1 1 1 0 0  ) ) )
+ ( display       brick        ( ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0  ) ) )
+ ( display       dagger       ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 1 1 1 1 1 0 0 0 1 1 1 1 1 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0  ) ) )
+ ( display       triangle     ( ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0  )
+                                ( 0 1 0 0 0 0 0 1 0 0 0 0 0 0 0 0  )
+                                ( 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 1 0 1 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0  )
+                                ( 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 0  )
+                                ( 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  )
+                                ( 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  ) ) )
+ ( display       x            ( ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 1 0 0 0 1 0 0 0 1 0 0 0 1 0 0 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  )
+                                ( 0 0 1 0 0 0 1 0 0 0 1 0 0 0 1 0  )
+                                ( 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1  ) ) )
+)
+drDefineLineStyle(
+;( DisplayName   LineStyle    Size       Pattern   )
+ ( display       solid        1          (1 1 1 ) )
+ ( display       dashed       1          (1 1 1 1 0 0 ) )
+ ( display       dots         1          (1 0 0 ) )
+ ( display       dashDot      1          (1 1 1 0 0 1 0 0 ) )
+ ( display       shortDash    1          (1 1 0 0 ) )
+ ( display       doubleDash   1          (1 1 1 1 0 0 1 1 0 0 ) )
+ ( display       hidden       1          (1 0 0 0 ) )
+ ( display       thickLine    3          (1 1 1 ) )
+ ( display       thickDots    3          (1 0 0 ) )
+)
+drDefinePacket(
+;( DisplayName  PacketName           Stipple    LineStyle  Fill       Outline    [FillStyle])
+ ( display      AA                   dots       thickDots  winColor4  winColor4  outlineStipple)
+ ( display      C1                   blank      thickLine  purple     purple     X         )
+ ( display      M1                   dots       solid      forest     forest     outlineStipple)
+ ( display      NBL                  x          dashed     silver     silver     outlineStipple)
+ ( display      NHV                  slash      dashDots   cadetBlue  cadetBlue  outlineStipple)
+ ( display      NP                   dots       shortDash  navy       navy       outlineStipple)
+ ( display      NW                   dots       doubleDash cadetBlue  cadetBlue  outlineStipple)
+ ( display      P1                   dots1      solid      orange     orange     outlineStipple)
+ ( display      P2                   blank      solid      brown      brown      solid     )
+ ( display      PA                   brick      solid      slate      slate      outlineStipple)
+ ( display      PBL                  triangle   solid      pink       pink       outlineStipple)
+ ( display      PHV                  vZigZag    solid      orange     orange     outlineStipple)
+ ( display      PP                   dots       solid      chocolate  chocolate  outlineStipple)
+ ( display      PTOP                 slash      solid      maroon     maroon     outlineStipple)
+ ( display      PW                   slash      solid      brown      brown      outlineStipple)
+ ( display      SP                   backSlash  solid      brown      brown      outlineStipple)
+ ( display      VTH                  hLine      solid      orange     orange     outlineStipple)
+ ( display      P1net                dots1      hidden     orange     white      outlineStipple)
+ ( display      P2net                blank      hidden     brown      white      outlineStipple)
+ ( display      C1net                blank      hidden     purple     white      X         )
+ ( display      M1net                dots       hidden     forest     white      outlineStipple)
+)
diff --git a/ruby/testdata_2/techfile.tf b/ruby/testdata_2/techfile.tf
new file mode 100755
index 0000000..8c03161
--- /dev/null
+++ b/ruby/testdata_2/techfile.tf
@@ -0,0 +1,96 @@
+
+;********************************
+; LAYER DEFINITION
+;********************************
+layerDefinitions(
+
+ techPurposes(
+ ;( PurposeName               Purpose#   Abbreviation )
+ ;( -----------               --------   ------------ )
+  ( drawing                   252        drw          )
+  ( net                       253        net          )
+ ) ;techPurposes
+
+ techLayers(
+ ;( LayerName                 Layer#     Abbreviation )
+ ;( ---------                 ------     ------------ )
+ ;User-Defined Layers:
+  ( PW                        1          PW           )
+  ( NBL                       2          NBL          )
+  ( SP                        3          SP           )
+  ( PBL                       6          PBL          )
+  ( C1                        9          C1           )
+  ( M1                        10         M1           )
+  ( PA                        11         PA           )
+  ( NW                        12         NW           )
+  ( NHV                       23         NHV          )
+  ( PHV                       24         PHV          )
+  ( PTOP                      25         PTOP         )
+  ( P1                        30         P1           )
+  ( P2                        31         P2           )
+  ( AA                        54         AA           )
+  ( VTH                       91         VTH          )
+  ( PP                        97         PP           )
+  ( NP                        98         NP           )
+ ) ;techLayers
+
+ techLayerPurposePriorities(
+ ;layers are ordered from lowest to highest priority
+ ;( LayerName                 Purpose    )
+ ;( ---------                 -------    )
+  ( NBL                       drawing    )
+  ( PBL                       drawing    )
+  ( PW                        drawing    )
+  ( NW                        drawing    )
+  ( PTOP                      drawing    )
+  ( AA                        drawing    )
+  ( VTH                       drawing    )
+  ( P1                        drawing    )
+  ( NHV                       drawing    )
+  ( PHV                       drawing    )
+  ( SP                        drawing    )
+  ( P2                        drawing    )
+  ( NP                        drawing    )
+  ( PP                        drawing    )
+  ( C1                        drawing    )
+  ( M1                        drawing    )
+  ( PA                        drawing    )
+  ( P1                        net        )
+  ( P2                        net        )
+  ( C1                        net        )
+  ( M1                        net        )
+ ) ;techLayerPurposePriorities
+
+ techDisplays(
+ ;( LayerName    Purpose      Packet          Vis Sel Con2ChgLy DrgEnbl Valid )
+ ;( ---------    -------      ------          --- --- --------- ------- ----- )
+  ( NBL          drawing      NBL              t t t t t )
+  ( PBL          drawing      PBL              t t t t t )
+  ( PW           drawing      PW               t t t t t )
+  ( NW           drawing      NW               t t t t t )
+  ( PTOP         drawing      PTOP             t t t t t )
+  ( AA           drawing      AA               t t t t t )
+  ( VTH          drawing      VTH              t t t t t )
+  ( P1           drawing      P1               t t t t t )
+  ( NHV          drawing      NHV              t t t t t )
+  ( PHV          drawing      PHV              t t t t t )
+  ( SP           drawing      SP               t t t t t )
+  ( P2           drawing      P2               t t t t t )
+  ( NP           drawing      NP               t t t t t )
+  ( PP           drawing      PP               t t t t t )
+  ( C1           drawing      C1               t t t t t )
+  ( M1           drawing      M1               t t t t t )
+  ( PA           drawing      PA               t t t t t )
+  ( P1           net          P1net            t t t t nil )
+  ( P2           net          P2net            t t t t nil )
+  ( C1           net          C1net            t t t t nil )
+  ( M1           net          M1net            t t t t nil )
+ ) ;techDisplays
+
+techLayerProperties(
+;( PropName               Layer1 [ Layer2 ]            PropValue )
+)
+
+) ;layerDefinitions
+
+
diff --git a/ruby/testdata_2/test.layermap b/ruby/testdata_2/test.layermap
new file mode 100644
index 0000000..d2b36f8
--- /dev/null
+++ b/ruby/testdata_2/test.layermap
@@ -0,0 +1,28 @@
+
+# A comment
+
+# layer  purpose  layer  datatype
+# ------------------------------------
+
+  NBL    drawing	2      0
+  PBL    drawing	6      0
+  PW     drawing 	1      0
+  NW     drawing 	12     0
+  PTOP   drawing 	25     0
+  AA     drawing 	54     0
+  VTH    drawing 	91     0
+  P1     drawing 	30     0
+  NHV    drawing 	23     0
+  PHV    drawing 	24     0
+  SP     drawing 	3      0
+  P2     drawing 	31     0
+  NP     drawing 	98     0
+  PP     drawing 	97     0
+  C1     drawing 	9      0
+  M1     drawing 	10     0
+  PA     drawing 	11     1
+  P2     net 	    101
+  P1     net 	    102
+  M1     net 	    113
+  C1     net 	    104
+
diff --git a/ruby/tests.rb b/ruby/tests.rb
new file mode 100644
index 0000000..c7b5705
--- /dev/null
+++ b/ruby/tests.rb
@@ -0,0 +1,155 @@
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# LICENSE file for details.
+#
+# DESCRIPTION: Cadence tech file importer - tests
+
+# Force load of import_tf.rb
+load File.join(File.dirname(__FILE__), "import_tf.rb")
+
+require 'test/unit'
+require 'test/unit/ui/console/testrunner'
+
+module TechfileToKLayout
+
+  class TFImport_TestClass < Test::Unit::TestCase
+  
+    def test_read1
+
+      lv = RBA::LayoutView::new
+      
+      tf_file = File.join(File.dirname(__FILE__), "testdata_1", "techfile.tf")
+      TechfileToKLayout.import_techfile(lv, tf_file)
+      
+      lp = []
+      
+      li = lv.begin_layers
+      while !li.at_end?
+        lp << [
+          li.current.fill_color, 
+          li.current.frame_color, 
+          li.current.dither_pattern,
+          li.current.line_style,
+          li.current.name,
+          li.current.source,
+          li.current.width,
+          li.current.valid?,
+          li.current.xfill?
+        ]
+        li.next
+      end
+
+      ref = [
+        # fill color  frame color dp  ls  name                   source     w  valid  xfill
+        [ 0xffd9e6ff, 0xffd9e6ff, 62, 9,  'NBL.drawing - 2/0',   '2/0@1',   1, true,  false ],
+        [ 0xffffbff2, 0xffffbff2, 61, 8,  'PBL.drawing - 6/0',   '6/0@1',   1, true,  false ],
+        [ 0xffbf4026, 0xffbf4026, 53, 8,  'PW.drawing - 1/0',    '1/0@1',   1, true,  false ],
+        [ 0xff39bfff, 0xff39bfff, 47, 13, 'NW.drawing - 12/0',   '12/0@1',  1, true,  false ],
+        [ 0xffe61f0d, 0xffe61f0d, 53, 8,  'PTOP.drawing - 25/0', '25/0@1',  1, true,  false ],
+        [ 0xffcccccc, 0xffcccccc, 47, 16, 'AA.drawing - 54/0',   '54/0@1',  3, true,  false ],
+        [ 0xffe38b00, 0xffe38b00, 49, 8,  'VTH.drawing - 91/0',  '91/0@1',  1, true,  false ],
+        [ 0xffe38b00, 0xffe38b00, 48, 8,  'P1.drawing - 30/0',   '30/0@1',  1, true,  false ],
+        [ 0xff39bfff, 0xff39bfff, 53, 0,  'NHV.drawing - 23/0',  '23/0@1',  0, true,  false ],
+        [ 0xffe38b00, 0xffe38b00, 56, 8,  'PHV.drawing - 24/0',  '24/0@1',  1, true,  false ],
+        [ 0xffbf4026, 0xffbf4026, 54, 8,  'SP.drawing - 3/0',    '3/0@1',   1, true,  false ],
+        [ 0xffbf4026, 0xffbf4026, 1,  8,  'P2.drawing - 31/0',   '31/0@1',  1, true,  false ],
+        [ 0xff333399, 0xff333399, 47, 12, 'NP.drawing - 98/0',   '98/0@1',  1, true,  false ],
+        [ 0xff802626, 0xff802626, 47, 8,  'PP.drawing - 97/0',   '97/0@1',  1, true,  false ],
+        [ 0xff9900e6, 0xff9900e6, 1,  15, 'C1.drawing - 9/0',    '9/0@1',   3, true,  true  ],
+        [ 0xff268c6b, 0xff268c6b, 47, 8,  'M1.drawing - 10/0',   '10/0@1',  1, true,  false ],
+        [ 0xff8c8ca6, 0xff8c8ca6, 59, 8,  'PA.drawing - 11/0',   '11/0@1',  1, true,  false ],
+        [ 0xffe38b00, 0xffffffff, 48, 14, 'P1.net - 102/0',      '102/0@1', 1, false, false ],
+        [ 0xffbf4026, 0xffffffff, 1,  14, 'P2.net - 101/0',      '101/0@1', 1, false, false ],
+        [ 0xff9900e6, 0xffffffff, 1,  14, 'C1.net - 104/0',      '104/0@1', 1, false, true  ],
+        [ 0xff268c6b, 0xffffffff, 47, 14, 'M1.net - 103/0',      '103/0@1', 1, false, false ]
+      ]
+
+      [ ref.size, lp.size ].max.times do |i|
+        assert_equal(ref[i].inspect, lp[i].inspect)
+      end
+
+    end
+    
+    def test_read2
+
+      lv = RBA::LayoutView::new
+      
+      tf_file = File.join(File.dirname(__FILE__), "testdata_2", "techfile.tf")
+      TechfileToKLayout.import_techfile(lv, tf_file)
+      
+      lp = []
+      
+      li = lv.begin_layers
+      while !li.at_end?
+        lp << [
+          li.current.fill_color, 
+          li.current.frame_color, 
+          li.current.dither_pattern,
+          li.current.line_style,
+          li.current.name,
+          li.current.source,
+          li.current.width,
+          li.current.valid?,
+          li.current.xfill?
+        ]
+        li.next
+      end
+
+      ref = [
+        # fill color  frame color dp  ls  name                   source     w  valid  xfill
+        [ 0xffd9e6ff, 0xffd9e6ff, 62, 9,  'NBL.drawing - 2/0',   '2/0@1',   1, true,  false ],
+        [ 0xffffbff2, 0xffffbff2, 61, 8,  'PBL.drawing - 6/0',   '6/0@1',   1, true,  false ],
+        [ 0xffbf4026, 0xffbf4026, 53, 8,  'PW.drawing - 1/0',    '1/0@1',   1, true,  false ],
+        [ 0xff39bfff, 0xff39bfff, 47, 13, 'NW.drawing - 12/0',   '12/0@1',  1, true,  false ],
+        [ 0xffe61f0d, 0xffe61f0d, 53, 8,  'PTOP.drawing - 25/0', '25/0@1',  1, true,  false ],
+        [ 0xffcccccc, 0xffcccccc, 47, 16, 'AA.drawing - 54/0',   '54/0@1',  3, true,  false ],
+        [ 0xffe38b00, 0xffe38b00, 49, 8,  'VTH.drawing - 91/0',  '91/0@1',  1, true,  false ],
+        [ 0xffe38b00, 0xffe38b00, 48, 8,  'P1.drawing - 30/0',   '30/0@1',  1, true,  false ],
+        [ 0xff39bfff, 0xff39bfff, 53, 0,  'NHV.drawing - 23/0',  '23/0@1',  0, true,  false ],
+        [ 0xffe38b00, 0xffe38b00, 56, 8,  'PHV.drawing - 24/0',  '24/0@1',  1, true,  false ],
+        [ 0xffbf4026, 0xffbf4026, 54, 8,  'SP.drawing - 3/0',    '3/0@1',   1, true,  false ],
+        [ 0xffbf4026, 0xffbf4026, 1,  8,  'P2.drawing - 31/0',   '31/0@1',  1, true,  false ],
+        [ 0xff333399, 0xff333399, 47, 12, 'NP.drawing - 98/0',   '98/0@1',  1, true,  false ],
+        [ 0xff802626, 0xff802626, 47, 8,  'PP.drawing - 97/0',   '97/0@1',  1, true,  false ],
+        [ 0xff9900e6, 0xff9900e6, 1,  15, 'C1.drawing - 9/0',    '9/0@1',   3, true,  true  ],
+        [ 0xff268c6b, 0xff268c6b, 47, 8,  'M1.drawing - 10/0',   '10/0@1',  1, true,  false ],
+        [ 0xff8c8ca6, 0xff8c8ca6, 59, 8,  'PA.drawing - 11/1',   '11/1@1',  1, true,  false ],
+        [ 0xffe38b00, 0xffffffff, 48, 14, 'P1.net - 102/0',      '102/0@1', 1, false, false ],
+        [ 0xffbf4026, 0xffffffff, 1,  14, 'P2.net - 101/0',      '101/0@1', 1, false, false ],
+        [ 0xff9900e6, 0xffffffff, 1,  14, 'C1.net - 104/0',      '104/0@1', 1, false, true  ],
+        [ 0xff268c6b, 0xffffffff, 47, 14, 'M1.net - 113/0',      '113/0@1', 1, false, false ]
+      ]
+
+      [ ref.size, lp.size ].max.times do |i|
+        assert_equal(ref[i].inspect, lp[i].inspect)
+      end
+
+    end
+    
+  end
+  
+  
+  # Runs the tests
+  
+  class TestRunner < Test::Unit::UI::Console::TestRunner
+    def initialize(suite, *args)
+      super(suite, *args)
+    end
+    def test_started(name)
+      super
+    end
+  end
+  
+  err = 0
+  self.constants.each do |c|
+    if c.to_s =~ /_TestClass$/
+      r = TestRunner::new(self.const_get(c), :output => $stdout).start
+      err += r.error_count + r.failure_count
+    end
+  end
+  
+  err == 0 || $stderr.puts("Test(s) failed. See log for details")
+
+end
\ No newline at end of file