diff --git a/.appveyor.yml b/.appveyor.yml
index e1ed8d0..f546a66 100644
--- a/.appveyor.yml
+++ b/.appveyor.yml
@@ -1,3 +1,4 @@
+image: Visual Studio 2019
 environment:
   matrix:
     - MSYSTEM : MINGW64
@@ -34,6 +35,9 @@ build_script:
 
   - bash -lc "exec 0</dev/null && /c/adms-win%MBITS%/bin/admsXml -v"
 
+test_script:
+  - bash -lc "cd $APPVEYOR_BUILD_FOLDER/testcases && ./testADMS.sh /c/adms-win%MBITS%/bin/admsXml.exe"
+
 after_build:
   #  artifacts path is always relative to build folder, so put the zip there
   - 7z a %APPVEYOR_BUILD_FOLDER%\adms-win%MBITS%.zip %ADMSDIR%
diff --git a/.travis.yml b/.travis.yml
index e92ec9c..92aac02 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,6 +2,9 @@ language: c
 
 sudo: required
 dist: trusty
+arch: 
+  - ppc64le
+  - AMD64
 
 compiler:
   - gcc
diff --git a/AUTHORS b/AUTHORS
index f3cb518..2c54836 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -3,7 +3,7 @@ Original Author
 Laurent Lemaitre <Laurent_Lemaitre-R29173@email.mot.com>
 
 Contributors
-------------s
+------------
   o Modelization Groups
 	Colin McAndrew <Colin_McAndrew-RP3881@email.mot.com>
 	James Victory <James_Victory-RZCB60@email.mot.com>
@@ -12,3 +12,6 @@ Contributors
   o MDAS Group
 	Savithri S <Savithri_S-A12801@email.mot.com>
 	Kuntal Joardar <Kuntal_Joardar-RRNR50@email.mot.com>
+  o bugfixes
+	Neal Wood <neal.wood@protonmail.com>
+   (TODO: probably more)
diff --git a/NEWS b/NEWS
index f80451d..d1387ba 100644
--- a/NEWS
+++ b/NEWS
@@ -96,6 +96,13 @@
             release adms-2.0.1
 ===== gap ====
 21-11-2016: 2.3.6
-**-08-2020: 2.3.7. minor release.
+18-08-2020: 2.3.7. minor release.
             reproducible build, typo fixes,
             include path, instructions
+*****-2022: 2.3.8.
+            add more numerical constants
+            provide constants script for more flexibility
+            move ADMS_INCLUDEDIR to back of include directory search path list
+            allow semicolon after identifier in disciple/nature declaration
+            add basic support for escaped identifiers
+            allow for multiple attribute instances
diff --git a/admsXml/admsXml.c b/admsXml/admsXml.c
index fa15213..5d314b4 100644
--- a/admsXml/admsXml.c
+++ b/admsXml/admsXml.c
@@ -617,7 +617,7 @@ static void parseva (const int argc,const char** argv,char* myverilogamsfile)
     pproot()->includePath=getlist_from_argv(argc,argv,"-I","directory");
     adms_slist_push(&pproot()->includePath,(p_adms)".");
 #ifdef ADMS_INCLUDEDIR
-    adms_slist_push(&pproot()->includePath,(p_adms)ADMS_INCLUDEDIR);
+    adms_slist_concat(&pproot()->includePath,adms_slist_new((p_adms)ADMS_INCLUDEDIR));
 #endif
     adms_preprocessor_get_define_from_argv(argc,argv);
     adms_preprocessor_define_add_default("insideADMS");
diff --git a/admsXml/constants.vams b/admsXml/constants.vams
index 88df0e6..d692e76 100644
--- a/admsXml/constants.vams
+++ b/admsXml/constants.vams
@@ -4,7 +4,7 @@ This file is part of adms - http://sourceforge.net/projects/mot-adms.
 adms is a code generator for the Verilog-AMS language.
 
 Copyright (C) 2016 Guilherme Brondani Torri <guitorri@gmail.com>
-              2016 Felix Salfelder <felix@salfelder.org>
+              2016, 2022 Felix Salfelder <felix@salfelder.org>
 
 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
@@ -48,4 +48,13 @@ along with this program.  If not, see <http://www.gnu.org/licenses/>.
 `define P_H 6.62607004081e-34 //planck constant. in \text{ J⋅s}
 `define P_U0 1.2566370614e-6 // v. perm.  H / m or T·m / A or Wb / (A·m) or V·s / (A·m)
 
+// (also) from https://github.com/Qucs/ADMS/wiki/Header-license-issue#clean-room-implementation
+`define M_1_PI 0.31830988618379068
+`define M_2_PI 0.63661977236758135
+`define M_2_SQRTPI 1.1283791670955126
+`define M_PI_2 1.5707963267948966
+`define M_PI_4 0.78539816339744830
+`define M_TWO_PI 6.28318530717958
+`define M_1_SQRT2 .70710678118654752440
+
 `endif // CONSTANTS_VAMS
diff --git a/admsXml/verilogaLex.l b/admsXml/verilogaLex.l
index ea1dfe4..443658e 100644
--- a/admsXml/verilogaLex.l
+++ b/admsXml/verilogaLex.l
@@ -274,6 +274,7 @@ INF {TKRETURN(yytext,yyleng); return tk_inf;}
 \|\| {TKRETURN(yytext,yyleng); return tk_or;}
 \^\~ {TKRETURN(yytext,yyleng); return tk_bitwise_equr;}
 
+\\{ident}" " {TKSTRIPPEDRETURN(yytext,yyleng); return tk_ident;}
 \${ident} {TKRETURN(yytext,yyleng); return tk_dollar_ident;}
 {char} {TKSTRIPPEDRETURN(yytext,yyleng); return tk_char;}
 {b8_int} {TKRETURN(yytext,yyleng); return tk_integer;}
diff --git a/admsXml/verilogaYacc.y.in b/admsXml/verilogaYacc.y.in
index e746d00..89980f7 100644
--- a/admsXml/verilogaYacc.y.in
+++ b/admsXml/verilogaYacc.y.in
@@ -138,8 +138,12 @@ R_s.admsParse
         | R_discipline_member
         | R_nature_member
         ;
+R_optional_semicolon
+        |
+        | ';'
+        ;
 R_discipline_member
-        | tk_discipline R_discipline_name R_l.discipline_assignment tk_enddiscipline
+        | tk_discipline R_discipline_name R_optional_semicolon R_l.discipline_assignment tk_enddiscipline
           _ adms_admsmain_list_discipline_prepend_once_or_abort(root(),gDiscipline);
           _ gDiscipline=NULL;
         ;
@@ -174,7 +178,7 @@ R_discipline.naturename
         ;
 
 R_nature_member
-        | tk_nature tk_ident R_l.nature_assignment tk_endnature
+        | tk_nature tk_ident R_optional_semicolon R_l.nature_assignment tk_endnature
           _ p_nature mynature=NULL;
           _ if(gNatureAccess) 
           _   mynature=adms_admsmain_list_nature_prepend_by_id_once_or_abort(root(),gNatureAccess);
@@ -274,7 +278,11 @@ R_s.nature_assignment
         ;
 R_d.attribute.0
         |
+        | R_d.attribute.1
+        ;
+R_d.attribute.1
         | R_d.attribute
+        | R_d.attribute.1 R_d.attribute
         ;
 R_d.attribute
         | tk_beginattribute R_l.attribute tk_endattribute
@@ -366,7 +374,7 @@ R_s.declaration.withattribute
           _ set_context(ctx_moduletop);
         ;
 R_d.attribute.global
-        | R_d.attribute
+        | R_d.attribute.1
           _ gGlobalAttributeList=gAttributeList;
           _ gAttributeList=NULL;
         ;
@@ -1186,7 +1194,7 @@ R_s.assignment
           _ Y($$,(p_adms)myassignment);
           _ myvariableprototype->_vcount++;
           _ myvariableprototype->_vlast=myassignment;
-        | R_d.attribute tk_ident '=' R_s.expression
+        | R_d.attribute.1 tk_ident '=' R_s.expression
           _ p_assignment myassignment;
           _ p_variable myvariable=variable_recursive_lookup_by_id(gBlockList->data,$2);
           _ p_variableprototype myvariableprototype;
@@ -1220,7 +1228,7 @@ R_s.assignment
           _ Y($$,(p_adms)myassignment);
           _ myvariableprototype->_vcount++;
           _ myvariableprototype->_vlast=myassignment;
-        | R_d.attribute tk_ident '[' R_expression ']' '=' R_s.expression
+        | R_d.attribute.1 tk_ident '[' R_expression ']' '=' R_s.expression
           _ p_assignment myassignment;
           _ p_array myarray;
           _ p_variable myvariable=variable_recursive_lookup_by_id(gBlockList->data,$2);
diff --git a/contrib/mkconstants.pl b/contrib/mkconstants.pl
new file mode 100755
index 0000000..83c4042
--- /dev/null
+++ b/contrib/mkconstants.pl
@@ -0,0 +1,117 @@
+#!/usr/bin/env perl
+# Generate a Verilog-AMS 'constants.vams' standard header file
+
+use strict;
+use warnings;
+use bignum (accuracy => 17, qw/PI e/); # adjusts number of significant figures
+use English qw/-no_match_vars/;
+
+# Calculate mathematical constants using Perl's arbitrary-precision arithmetic
+my %maths_consts = (
+    M_1_PI     => 1.0 / PI,
+    M_2_PI     => 2.0 / PI,
+    M_2_SQRTPI => 2.0 / sqrt(PI),
+    M_E        => e,
+    M_LN10     => log(10.0),
+    M_LN2      => log(2.0),
+    M_LOG10E   => 1.0 / log(10.0),
+    M_LOG2E    => 1.0 / log(2.0),
+    M_PI       => PI,
+    M_PI_2     => PI / 2.0,
+    M_PI_4     => PI / 4.0,
+    M_SQRT1_2  => 1.0 / sqrt(2.0),
+    M_SQRT2    => sqrt(2.0),
+    M_TWO_PI   => 2.0 * PI,
+);
+
+# Get physical constants from NIST 2018 CODATA adjusted listing
+my %phys_consts = (
+    P_C        => { desc  => "speed of light in vacuum",     },
+    P_CELSIUS0 => { desc  => "zero degrees Celsius",
+                    val   => "273.15",
+                    err   => "(exact)",
+                    units => "K",                            },
+    P_EPS0     => { desc  => "vacuum electric permittivity", },
+    P_H        => { desc  => "Planck constant",              },
+    P_K        => { desc  => "Boltzmann constant",           },
+    P_Q        => { desc  => "elementary charge",            },
+    P_U0       => { desc  => "vacuum mag. permeability",     },
+);
+my $allascii_txt = "allascii.txt";
+unless (-r $allascii_txt) {
+    print "Attempting to download '$allascii_txt' from NIST website.\n";
+    my $url = "https://physics.nist.gov/cuu/Constants/Table/allascii.txt";
+    system(qq/curl -s -o "$allascii_txt" "$url"/) == 0
+        or die "Could not download '$allascii_txt': $OS_ERROR";
+}
+open my $fh, "<", $allascii_txt
+    or die "Could not open '$allascii_txt' for reading: $OS_ERROR";
+while (my $line = <$fh>) {
+    next if $NR < 12;
+    chomp $line;
+    my ($desc, $val, $err, $units) = split /\s{2,}/, $line;
+    foreach my $sym (keys %phys_consts) {
+        if ($phys_consts{$sym}{desc} eq $desc) {
+            $phys_consts{$sym}{val}   = $val =~ s/\s//gr;
+            $phys_consts{$sym}{err}   = $err =~ s/\s//gr;
+            $phys_consts{$sym}{units} = $units;
+            last;
+        }
+    }
+}
+close $fh or die "Could not close '$allascii_txt': $OS_ERROR";
+
+# Generate output file
+my $constants_vams = "constants.vams";
+open $fh, ">", $constants_vams
+    or die "Could not open '$constants_vams' for writing: $OS_ERROR";
+select $fh;
+print <<'EOF';
+/*
+This file is part of adms - http://sourceforge.net/projects/mot-adms.
+
+adms is a code generator for the Verilog-AMS language.
+
+Copyright (C) 2016 Guilherme Brondani Torri <guitorri@gmail.com>
+              2016 Felix Salfelder <felix@salfelder.org>
+              2022 Neal Graham Wood <neal.wood@protonmail.com>
+
+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 3 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.
+
+You should have received a copy of the GNU General Public License
+along with this program.  If not, see <http://www.gnu.org/licenses/>.
+*/
+
+`ifdef CONSTANTS_VAMS
+`else
+`define CONSTANTS_VAMS 1
+
+/* Mathematical constants */
+
+EOF
+foreach my $sym (sort keys %maths_consts) {
+    my $val = $maths_consts{$sym};
+    printf "%-8s%-16s%s\n", "`define", $sym, $val;
+}
+print <<'EOF';
+
+/* Physical constants */
+
+EOF
+foreach my $sym (sort keys %phys_consts) {
+    my ($desc, $val, $units) = @{$phys_consts{$sym}}{qw/desc val units/};
+    printf "// %s -- %s\n", $desc, $units;
+    printf "%-8s%-16s%s\n\n", "`define", $sym, $val;
+}
+print <<'EOF';
+`endif // CONSTANTS_VAMS
+EOF
+close $fh or die "Could not close '$constants_vams': $OS_ERROR";
diff --git a/debian/changelog b/debian/changelog
index 0eb0b40..bcedf64 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,9 @@
+adms (2.3.7+git20220122.1.cadf421-1) UNRELEASED; urgency=low
+
+  * New upstream snapshot.
+
+ -- Debian Janitor <janitor@jelmer.uk>  Tue, 19 Apr 2022 13:19:00 -0000
+
 adms (2.3.7-1) unstable; urgency=medium
 
   * Team upload
diff --git a/debian/patches/0001-Spelling-errors.patch b/debian/patches/0001-Spelling-errors.patch
index 65db2b6..a899991 100644
--- a/debian/patches/0001-Spelling-errors.patch
+++ b/debian/patches/0001-Spelling-errors.patch
@@ -8,31 +8,31 @@ Subject: Spelling errors
  admsXml/admsXml.c   | 6 +++---
  3 files changed, 5 insertions(+), 5 deletions(-)
 
-diff --git a/admsXml/admsCheck.1 b/admsXml/admsCheck.1
-index fe33759..045f6de 100644
---- a/admsXml/admsCheck.1
-+++ b/admsXml/admsCheck.1
+Index: adms/admsXml/admsCheck.1
+===================================================================
+--- adms.orig/admsXml/admsCheck.1
++++ adms/admsXml/admsCheck.1
 @@ -1,4 +1,4 @@
 -.TH admsCheck "1" "September 2008" "Debian/GNU Linux" "User Commands"
 +.TH admsCheck "1" "September 2008" "Debian GNU/Linux" "User Commands"
  .SH NAME
  admsCheck \- Test Program for admsXml
  .SH SYNOPSIS
-diff --git a/admsXml/admsXml.1 b/admsXml/admsXml.1
-index 5a46ce0..0c095a7 100644
---- a/admsXml/admsXml.1
-+++ b/admsXml/admsXml.1
+Index: adms/admsXml/admsXml.1
+===================================================================
+--- adms.orig/admsXml/admsXml.1
++++ adms/admsXml/admsXml.1
 @@ -1,4 +1,4 @@
 -.TH admsXml "1" "September 2008" "Debian/GNU Linux" "User Commands"
 +.TH admsXml "1" "September 2008" "Debian GNU/Linux" "User Commands"
  .SH NAME
  admsXml \- An automatic device model synthesizer.
  .SH SYNOPSIS
-diff --git a/admsXml/admsXml.c b/admsXml/admsXml.c
-index a618dad..a16f467 100644
---- a/admsXml/admsXml.c
-+++ b/admsXml/admsXml.c
-@@ -488,7 +488,7 @@ static void awrite (p_transform mytransform,p_admst mylhs,p_admst myrhsori)
+Index: adms/admsXml/admsXml.c
+===================================================================
+--- adms.orig/admsXml/admsXml.c
++++ adms/admsXml/admsXml.c
+@@ -488,7 +488,7 @@ static void awrite (p_transform mytransf
      ||(myrhs->_pseudo==admse_basicreal)
      ||(myrhs->_pseudo==admse_basicstring))
      {
@@ -41,7 +41,7 @@ index a618dad..a16f467 100644
        adms_message_fatal(("see %s\n",adms_transform_uid(mytransform)))
      }
      else
-@@ -502,10 +502,10 @@ static void awrite (p_transform mytransform,p_admst mylhs,p_admst myrhsori)
+@@ -502,10 +502,10 @@ static void awrite (p_transform mytransf
      operation is done below anyway, it shouldn't be considered as an
      error.
  
diff --git a/testcases/0003_subdev.xml b/testcases/0003_subdev.xml
new file mode 100644
index 0000000..e69de29
diff --git a/testcases/Makefile.am b/testcases/Makefile.am
new file mode 100644
index 0000000..8138141
--- /dev/null
+++ b/testcases/Makefile.am
@@ -0,0 +1 @@
+CLEANFILES = discipline.h .*.va.adms .adms.implicit.xml .interface.xml
diff --git a/testcases/out/.0000_scale_factor.va.adms b/testcases/out/.0000_scale_factor.va.adms
new file mode 100644
index 0000000..1132e2a
--- /dev/null
+++ b/testcases/out/.0000_scale_factor.va.adms
@@ -0,0 +1,48 @@
+# 1 "./0000_scale_factor.va"
+
+
+
+
+
+module scaling();
+ parameter integer itera  = 1T;
+ parameter integer igiga  = 1G;
+ parameter integer imega  = 1M;
+ parameter integer iKilo  = 1K;
+ parameter integer ikilo  = 1k;
+ parameter integer imili  = 1m;
+ parameter integer imicro = 1u;
+ parameter integer inano  = 1n;
+ parameter integer ipico  = 1p;
+ parameter integer ifemto = 1f;
+ parameter integer iatto  = 1a;
+
+ parameter integer iexa      = 1E;
+ parameter integer ipeta     = 1P;
+ parameter integer ihecto    = 1h;
+ parameter integer ideca     = 1D;
+ parameter integer ideci     = 1d;
+ parameter integer icenti    = 1c;
+ parameter integer iamgstron = 1A;
+
+ parameter real tera  = 1.0T;
+ parameter real giga  = 1.0G;
+ parameter real mega  = 1.0M;
+ parameter real Kilo  = 1.0K;
+ parameter real kilo  = 1.0k;
+ parameter real mili  = 1.0m;
+ parameter real micro = 1.0u;
+ parameter real nano  = 1.0n;
+ parameter real pico  = 1.0p;
+ parameter real femto = 1.0f;
+ parameter real atto  = 1.0a;
+
+ parameter real exa      = 1.0E;
+ parameter real peta     = 1.0P;
+ parameter real hecto    = 1.0h;
+ parameter real deca     = 1.0D;
+ parameter real deci     = 1.0d;
+ parameter real centi    = 1.0c;
+ parameter real amgstron = 1.0A;
+
+endmodule
diff --git a/testcases/out/.0001_operator.va.adms b/testcases/out/.0001_operator.va.adms
new file mode 100644
index 0000000..e9b4b95
--- /dev/null
+++ b/testcases/out/.0001_operator.va.adms
@@ -0,0 +1,114 @@
+# 1 "./0001_operator.va"
+
+
+# 1 "discipline.h"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 25 "discipline.h"
+
+
+
+nature current
+  access = I;
+  units = "A";
+  abstol = 0.001234;
+endnature
+
+
+nature voltage
+  access = V;
+  units = "V";
+  abstol = 0.0004321;
+endnature
+
+
+nature power
+  access = Pwr;
+  units = "W";
+  abstol = 0.00101010;
+endnature
+
+
+nature flux
+  access = Phi;
+  units = "We";
+endnature
+
+
+nature temperature
+  access = Temp;
+  units = "K";
+  abstol = 3.14;
+endnature
+
+
+discipline thermal
+  potential temperature;
+  flow power;
+enddiscipline
+
+
+discipline electrical
+  potential voltage;
+  flow current;
+enddiscipline
+
+discipline magnetic
+  potential voltage; 
+  flow current; 
+enddiscipline
+
+discipline rotational_omega
+  potential voltage; 
+  flow current; 
+enddiscipline
+
+
+
+# 4 "./0001_operator.va"
+
+module sometest(p,n);
+	inout p,n;
+	electrical p,n;
+
+	parameter real c=1e-6 from [0:inf);
+	analog begin
+		begin
+			I(p,n) <+ c*ddt(V(n,p)*9);
+			I(p,n) <+ exp(ddt(V(p,n)));
+		end
+	end
+endmodule
+
+module anothertest(p,n);
+	inout p,n;
+	electrical p,n;
+
+	parameter real c=1e-6 from [0:inf);
+	analog begin
+		begin
+			real foo; foo = c*idt(exp(V(p,n)));
+			I(p,n) <+ pow(ddt(foo*V(p,n)),2);
+		end
+	end
+endmodule
diff --git a/testcases/out/.0002_transition.va.adms b/testcases/out/.0002_transition.va.adms
new file mode 100644
index 0000000..6a84d55
--- /dev/null
+++ b/testcases/out/.0002_transition.va.adms
@@ -0,0 +1,15 @@
+# 1 "./0002_transition.va"
+
+module trans();
+
+real out1, expr1, td, rt, ft, ttol;
+
+real out2, expr2;
+
+analog begin
+ out1 = transition(expr1, td, rt, ft, ttol);
+
+ out2 = transition(expr2 - 1.5, td);
+end
+
+endmodule
diff --git a/testcases/out/.0003_subdev.va.adms b/testcases/out/.0003_subdev.va.adms
new file mode 100644
index 0000000..9bfa3b7
--- /dev/null
+++ b/testcases/out/.0003_subdev.va.adms
@@ -0,0 +1,123 @@
+# 1 "./0003_subdev.va"
+
+# 1 "discipline.h"
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+# 25 "discipline.h"
+
+
+
+nature current
+  access = I;
+  units = "A";
+  abstol = 0.001234;
+endnature
+
+
+nature voltage
+  access = V;
+  units = "V";
+  abstol = 0.0004321;
+endnature
+
+
+nature power
+  access = Pwr;
+  units = "W";
+  abstol = 0.00101010;
+endnature
+
+
+nature flux
+  access = Phi;
+  units = "We";
+endnature
+
+
+nature temperature
+  access = Temp;
+  units = "K";
+  abstol = 3.14;
+endnature
+
+
+discipline thermal
+  potential temperature;
+  flow power;
+enddiscipline
+
+
+discipline electrical
+  potential voltage;
+  flow current;
+enddiscipline
+
+discipline magnetic
+  potential voltage; 
+  flow current; 
+enddiscipline
+
+discipline rotational_omega
+  potential voltage; 
+  flow current; 
+enddiscipline
+
+
+
+# 3 "./0003_subdev.va"
+
+module net(p, n);
+	inout p, n;
+	electrical p, n;
+
+
+	parameter real dummy=1 from [0:inf);
+
+	analog begin
+		begin
+			V(p, n) <+ 0;
+		end
+	end
+endmodule
+
+module RESISTOR(p, n);
+	inout p, n;
+	electrical p, n;
+
+	parameter real r=1 from [0:inf);
+	analog begin
+		begin
+			I(p, n) <+ V(p, n) / r;
+		end
+	end
+endmodule
+
+module schematic(pp, nn);
+	inout pp, nn;
+	electrical pp, nn;
+	electrical p_int, n_int;
+
+	net #(.dummy(0)) n1(p, p_int);
+	net #(.dummy(0)) n2(n, n_int);
+	RESISTOR #(.r(1)) r1(pp, nn);
+endmodule
diff --git a/testcases/testADMS.sh b/testcases/testADMS.sh
new file mode 100644
index 0000000..32853ba
--- /dev/null
+++ b/testcases/testADMS.sh
@@ -0,0 +1,33 @@
+#
+# Request admsXml as argument
+#
+if [ -z "$1" ]
+then
+  echo "  Missing path to admsXml executable."
+  echo "  Example: $ sh testADMS.sh /usr/local/admsXml"
+  exit 1
+else
+  ADMSXML=$1
+  echo "  Testing admsXml"
+  echo "  Using: $ADMSXML"
+fi
+
+#
+# list of all the tests to be run
+#
+arrayTest=(
+           0000_scale_factor
+           0001_operator
+           0002_transition
+           0003_subdev)
+
+# todo
+srcdir=.
+#
+# run admsXml and check output against reference
+#
+for test in "${arrayTest[@]}"
+do
+  $ADMSXML ${srcdir}/$test.va -e ${srcdir}/$test.xml
+  cmp ${srcdir}/out/.$test.va.adms .$test.va.adms
+done