Added emu
authorJoseph Coffland <joseph@cauldrondevelopment.com>
Tue, 12 Feb 2019 22:53:24 +0000 (14:53 -0800)
committerJoseph Coffland <joseph@cauldrondevelopment.com>
Tue, 12 Feb 2019 22:53:24 +0000 (14:53 -0800)
56 files changed:
.gitignore
CHANGELOG.md
docs/emu_chroot.md [new file with mode: 0644]
package-lock.json [deleted file]
package.json
scripts/setup_rpi.sh
src/avr/src/command.c
src/avr/src/command.h
src/avr/src/config.h
src/avr/src/drv8711.c
src/avr/src/emu.h [new file with mode: 0644]
src/avr/src/exec.c
src/avr/src/hardware.c
src/avr/src/huanyang.c
src/avr/src/jog.c
src/avr/src/lcd.c
src/avr/src/log.h [new file with mode: 0644]
src/avr/src/main.c
src/avr/src/messages.def
src/avr/src/motor.c
src/avr/src/pgmspace.h
src/avr/src/pins.h
src/avr/src/usart.c
src/avr/src/vars.c
src/avr/step-test/plot_velocity.py [changed mode: 0755->0644]
src/avr/test/.gitignore
src/avr/test/Makefile
src/avr/test/arc.gc [deleted file]
src/avr/test/firmware-test.c [deleted file]
src/avr/test/hal.c [deleted file]
src/avr/test/jogsim.cpp [deleted file]
src/avr/test/jogtest.py [deleted file]
src/avr/test/line.gc [deleted file]
src/avr/test/plot.py [deleted file]
src/avr/test/short.gc [deleted file]
src/avr/test/src/avr/eeprom.h [new file with mode: 0644]
src/avr/test/src/avr/interrupt.h [new file with mode: 0644]
src/avr/test/src/avr/io.h [new file with mode: 0644]
src/avr/test/src/avr/pgmspace.h [new file with mode: 0644]
src/avr/test/src/avr/wdt.h [new file with mode: 0644]
src/avr/test/src/emu.c [new file with mode: 0644]
src/avr/test/src/util/atomic.h [new file with mode: 0644]
src/avr/test/src/util/crc16.h [new file with mode: 0644]
src/avr/test/src/util/delay.h [new file with mode: 0644]
src/py/bbctrl/AVR.py [new file with mode: 0644]
src/py/bbctrl/AVREmu.py [new file with mode: 0644]
src/py/bbctrl/Camera.py
src/py/bbctrl/Cmd.py
src/py/bbctrl/Comm.py
src/py/bbctrl/Ctrl.py
src/py/bbctrl/I2C.py
src/py/bbctrl/Mach.py
src/py/bbctrl/Planner.py
src/py/bbctrl/Pwr.py
src/py/bbctrl/__init__.py
src/stylus/style.styl

index f64af0ed8d22a0001fe0635d3c3a9a228d7b4c95..ba12fc8a4aefd02d851646bd2baa97a8313637c3 100644 (file)
@@ -17,6 +17,7 @@ __pycache__
 *.deb
 *.zip
 /rpi-share
+/package-lock.json
 
 *.elf
 *.hex
index a17211f0e505ff87130ca502937bed78f8d36edb..c872b1fc5deb2a527c2045355a142dc662dae0f4 100644 (file)
@@ -1,6 +1,9 @@
 Buildbotics CNC Controller Firmware Changelog
 ==============================================
 
+## v0.4.6
+ - Fixed a rare ``Negative s-curve time`` error.
+
 ## v0.4.5
  - Fix for random errors while running VFD.
  - Fix bug where planner would not continue after optional pause (M1).
diff --git a/docs/emu_chroot.md b/docs/emu_chroot.md
new file mode 100644 (file)
index 0000000..348ed82
--- /dev/null
@@ -0,0 +1,45 @@
+This document describes how to setup the Buildbotics firmware in a chroot
+environment for the purposes of demonstrating the user interface.
+
+On a Debian system install:
+
+    ROOT=/opt/demo
+    sudo apt-get install -y binutils debootstrap
+    sudo mkdir $ROOT
+    sudo debootstrap --arch amd64 stable $ROOT/ http://deb.debian.org/debian
+
+Then chroot:
+
+    sudo mount --bind /dev $ROOT/dev/
+    sudo mount --bind /sys $ROOT/sys/
+    sudo mount --bind /proc $ROOT/proc/
+    sudo mount --bind /dev/pts $ROOT/dev/pts
+    sudo chroot $ROOT
+
+Setup the demo system:
+
+    export LC_ALL=C
+    apt-get update
+    apt-get install -y wget git python3-tornado python3-sockjs-tornado \
+      python3-setuptools python-six build-essential scons libv8-dev
+      libpython3-dev
+
+    cd /opt
+    BASE=https://buildbotics.com/bbctrl
+    LATEST=$(wget $BASE/latest.txt -O- -q)
+    wget $BASE/bbctrl-$LATEST.tar.bz2
+    tar xf bbctrl-$LATEST.tar.bz2
+    ln -sf bbctrl-$LATEST bbctrl
+
+    git clone --depth=1 https://github.com/CauldronDevelopmentLLC/cbang
+    git clone --depth=1 https://github.com/CauldronDevelopmentLLC/camotics
+    export CBANG_HOME=/opt/cbang
+    scons -C cbang -j8 disable_local="re2 libevent"
+    scons -C camotics -j8 gplan.so with_gui=False
+
+    cd bbctrl
+    python3 setup.py install
+    cp /opt/camotics/gplan.so /usr/local/lib/python*/dist-packages/bbctrl-$VERSION-py*.egg/camotics/gplan.so
+
+    mkdir -p /var/lib/bbctrl/upload
+    useradd -u 1001 bbmc
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644 (file)
index 1550f23..0000000
+++ /dev/null
@@ -1,2705 +0,0 @@
-{
-  "name": "bbctrl",
-  "version": "0.4.5",
-  "lockfileVersion": 1,
-  "requires": true,
-  "dependencies": {
-    "@types/babel-types": {
-      "version": "7.0.4",
-      "resolved": "https://registry.npmjs.org/@types/babel-types/-/babel-types-7.0.4.tgz",
-      "integrity": "sha512-WiZhq3SVJHFRgRYLXvpf65XnV6ipVHhnNaNvE8yCimejrGglkg38kEj0JcizqwSHxmPSjcTlig/6JouxLGEhGw=="
-    },
-    "@types/babylon": {
-      "version": "6.16.3",
-      "resolved": "https://registry.npmjs.org/@types/babylon/-/babylon-6.16.3.tgz",
-      "integrity": "sha512-lyJ8sW1PbY3uwuvpOBZ9zMYKshMnQpXmeDHh8dj9j2nJm/xrW0FgB5gLSYOArj5X0IfaXnmhFoJnhS4KbqIMug==",
-      "requires": {
-        "@types/babel-types": "*"
-      }
-    },
-    "JSONStream": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz",
-      "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==",
-      "requires": {
-        "jsonparse": "^1.2.0",
-        "through": ">=2.2.7 <3"
-      }
-    },
-    "acorn": {
-      "version": "6.0.2",
-      "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.0.2.tgz",
-      "integrity": "sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg=="
-    },
-    "acorn-globals": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-3.1.0.tgz",
-      "integrity": "sha1-/YJw9x+7SZawBPqIDuXUZXOnMb8=",
-      "requires": {
-        "acorn": "^4.0.4"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "4.0.13",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
-          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
-        }
-      }
-    },
-    "acorn-node": {
-      "version": "1.6.0",
-      "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.6.0.tgz",
-      "integrity": "sha512-ZsysjEh+Y3i14f7YXCAKJy99RXbd56wHKYBzN4FlFtICIZyFpYwK6OwNJhcz8A/FMtxoUZkJofH1v9KIfNgWmw==",
-      "requires": {
-        "acorn": "^6.0.1",
-        "acorn-walk": "^6.0.1",
-        "xtend": "^4.0.1"
-      }
-    },
-    "acorn-walk": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.1.0.tgz",
-      "integrity": "sha512-ugTb7Lq7u4GfWSqqpwE0bGyoBZNMTok/zDBXxfEG0QM50jNlGhIWjRC1pPN7bvV1anhF+bs+/gNcRw+o55Evbg=="
-    },
-    "ajv": {
-      "version": "5.5.2",
-      "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
-      "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
-      "optional": true,
-      "requires": {
-        "co": "^4.6.0",
-        "fast-deep-equal": "^1.0.0",
-        "fast-json-stable-stringify": "^2.0.0",
-        "json-schema-traverse": "^0.3.0"
-      }
-    },
-    "align-text": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz",
-      "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=",
-      "requires": {
-        "kind-of": "^3.0.2",
-        "longest": "^1.0.1",
-        "repeat-string": "^1.5.2"
-      }
-    },
-    "amdefine": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz",
-      "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU="
-    },
-    "ansi-regex": {
-      "version": "2.1.1",
-      "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
-      "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8="
-    },
-    "ansi-styles": {
-      "version": "2.2.1",
-      "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
-      "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
-    },
-    "array-filter": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz",
-      "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw="
-    },
-    "array-map": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz",
-      "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI="
-    },
-    "array-reduce": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz",
-      "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys="
-    },
-    "asap": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
-      "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY="
-    },
-    "asn1": {
-      "version": "0.2.4",
-      "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
-      "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
-      "optional": true,
-      "requires": {
-        "safer-buffer": "~2.1.0"
-      }
-    },
-    "asn1.js": {
-      "version": "4.10.1",
-      "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
-      "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
-      "requires": {
-        "bn.js": "^4.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "assert": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
-      "integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
-      "requires": {
-        "util": "0.10.3"
-      },
-      "dependencies": {
-        "inherits": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
-          "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
-        },
-        "util": {
-          "version": "0.10.3",
-          "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
-          "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
-          "requires": {
-            "inherits": "2.0.1"
-          }
-        }
-      }
-    },
-    "assert-plus": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
-      "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
-    },
-    "async": {
-      "version": "1.0.0",
-      "resolved": "http://registry.npmjs.org/async/-/async-1.0.0.tgz",
-      "integrity": "sha1-+PwEyjoTeErenhZBr5hXjPvWR6k=",
-      "optional": true
-    },
-    "asynckit": {
-      "version": "0.4.0",
-      "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
-      "optional": true
-    },
-    "aws-sign2": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
-      "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
-      "optional": true
-    },
-    "aws4": {
-      "version": "1.8.0",
-      "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
-      "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
-      "optional": true
-    },
-    "babel-runtime": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
-      "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
-      "requires": {
-        "core-js": "^2.4.0",
-        "regenerator-runtime": "^0.11.0"
-      }
-    },
-    "babel-types": {
-      "version": "6.26.0",
-      "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
-      "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
-      "requires": {
-        "babel-runtime": "^6.26.0",
-        "esutils": "^2.0.2",
-        "lodash": "^4.17.4",
-        "to-fast-properties": "^1.0.3"
-      }
-    },
-    "babylon": {
-      "version": "6.18.0",
-      "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz",
-      "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ=="
-    },
-    "balanced-match": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
-      "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c="
-    },
-    "base64-js": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz",
-      "integrity": "sha512-ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw=="
-    },
-    "bcrypt-pbkdf": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
-      "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
-      "optional": true,
-      "requires": {
-        "tweetnacl": "^0.14.3"
-      }
-    },
-    "bn.js": {
-      "version": "4.11.8",
-      "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
-      "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA=="
-    },
-    "brace-expansion": {
-      "version": "1.1.11",
-      "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
-      "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
-      "requires": {
-        "balanced-match": "^1.0.0",
-        "concat-map": "0.0.1"
-      }
-    },
-    "brorand": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
-      "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8="
-    },
-    "browser-pack": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/browser-pack/-/browser-pack-6.1.0.tgz",
-      "integrity": "sha512-erYug8XoqzU3IfcU8fUgyHqyOXqIE4tUTTQ+7mqUjQlvnXkOO6OlT9c/ZoJVHYoAaqGxr09CN53G7XIsO4KtWA==",
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "combine-source-map": "~0.8.0",
-        "defined": "^1.0.0",
-        "safe-buffer": "^5.1.1",
-        "through2": "^2.0.0",
-        "umd": "^3.0.0"
-      }
-    },
-    "browser-resolve": {
-      "version": "1.11.3",
-      "resolved": "https://registry.npmjs.org/browser-resolve/-/browser-resolve-1.11.3.tgz",
-      "integrity": "sha512-exDi1BYWB/6raKHmDTCicQfTkqwN5fioMFV4j8BsfMU4R2DK/QfZfK7kOVkmWCNANf0snkBzqGqAJBao9gZMdQ==",
-      "requires": {
-        "resolve": "1.1.7"
-      },
-      "dependencies": {
-        "resolve": {
-          "version": "1.1.7",
-          "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz",
-          "integrity": "sha1-IDEU2CrSxe2ejgQRs5ModeiJ6Xs="
-        }
-      }
-    },
-    "browserify": {
-      "version": "16.2.3",
-      "resolved": "https://registry.npmjs.org/browserify/-/browserify-16.2.3.tgz",
-      "integrity": "sha512-zQt/Gd1+W+IY+h/xX2NYMW4orQWhqSwyV+xsblycTtpOuB27h1fZhhNQuipJ4t79ohw4P4mMem0jp/ZkISQtjQ==",
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "assert": "^1.4.0",
-        "browser-pack": "^6.0.1",
-        "browser-resolve": "^1.11.0",
-        "browserify-zlib": "~0.2.0",
-        "buffer": "^5.0.2",
-        "cached-path-relative": "^1.0.0",
-        "concat-stream": "^1.6.0",
-        "console-browserify": "^1.1.0",
-        "constants-browserify": "~1.0.0",
-        "crypto-browserify": "^3.0.0",
-        "defined": "^1.0.0",
-        "deps-sort": "^2.0.0",
-        "domain-browser": "^1.2.0",
-        "duplexer2": "~0.1.2",
-        "events": "^2.0.0",
-        "glob": "^7.1.0",
-        "has": "^1.0.0",
-        "htmlescape": "^1.1.0",
-        "https-browserify": "^1.0.0",
-        "inherits": "~2.0.1",
-        "insert-module-globals": "^7.0.0",
-        "labeled-stream-splicer": "^2.0.0",
-        "mkdirp": "^0.5.0",
-        "module-deps": "^6.0.0",
-        "os-browserify": "~0.3.0",
-        "parents": "^1.0.1",
-        "path-browserify": "~0.0.0",
-        "process": "~0.11.0",
-        "punycode": "^1.3.2",
-        "querystring-es3": "~0.2.0",
-        "read-only-stream": "^2.0.0",
-        "readable-stream": "^2.0.2",
-        "resolve": "^1.1.4",
-        "shasum": "^1.0.0",
-        "shell-quote": "^1.6.1",
-        "stream-browserify": "^2.0.0",
-        "stream-http": "^2.0.0",
-        "string_decoder": "^1.1.1",
-        "subarg": "^1.0.0",
-        "syntax-error": "^1.1.1",
-        "through2": "^2.0.0",
-        "timers-browserify": "^1.0.1",
-        "tty-browserify": "0.0.1",
-        "url": "~0.11.0",
-        "util": "~0.10.1",
-        "vm-browserify": "^1.0.0",
-        "xtend": "^4.0.0"
-      },
-      "dependencies": {
-        "domain-browser": {
-          "version": "1.2.0",
-          "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
-          "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA=="
-        },
-        "events": {
-          "version": "2.1.0",
-          "resolved": "https://registry.npmjs.org/events/-/events-2.1.0.tgz",
-          "integrity": "sha512-3Zmiobend8P9DjmKAty0Era4jV8oJ0yGYe2nJJAxgymF9+N8F2m0hhZiMoWtcfepExzNKZumFU3ksdQbInGWCg=="
-        },
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        },
-        "vm-browserify": {
-          "version": "1.1.0",
-          "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.0.tgz",
-          "integrity": "sha512-iq+S7vZJE60yejDYM0ek6zg308+UZsdtPExWP9VZoCFCz1zkJoXFnAX7aZfd/ZwrkidzdUZL0C/ryW+JwAiIGw=="
-        }
-      }
-    },
-    "browserify-aes": {
-      "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
-      "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
-      "requires": {
-        "buffer-xor": "^1.0.3",
-        "cipher-base": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.3",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "browserify-cipher": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
-      "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
-      "requires": {
-        "browserify-aes": "^1.0.4",
-        "browserify-des": "^1.0.0",
-        "evp_bytestokey": "^1.0.0"
-      }
-    },
-    "browserify-des": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
-      "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "des.js": "^1.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "browserify-rsa": {
-      "version": "4.0.1",
-      "resolved": "http://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
-      "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "randombytes": "^2.0.1"
-      }
-    },
-    "browserify-sign": {
-      "version": "4.0.4",
-      "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
-      "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
-      "requires": {
-        "bn.js": "^4.1.1",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.2",
-        "elliptic": "^6.0.0",
-        "inherits": "^2.0.1",
-        "parse-asn1": "^5.0.0"
-      }
-    },
-    "browserify-zlib": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
-      "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
-      "requires": {
-        "pako": "~1.0.5"
-      }
-    },
-    "buffer": {
-      "version": "5.2.1",
-      "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.2.1.tgz",
-      "integrity": "sha512-c+Ko0loDaFfuPWiL02ls9Xd3GO3cPVmUobQ6t3rXNUk304u6hGq+8N/kFi+QEIKhzK3uwolVhLzszmfLmMLnqg==",
-      "requires": {
-        "base64-js": "^1.0.2",
-        "ieee754": "^1.1.4"
-      }
-    },
-    "buffer-from": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
-      "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A=="
-    },
-    "buffer-xor": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
-      "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk="
-    },
-    "builtin-status-codes": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
-      "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug="
-    },
-    "cached-path-relative": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cached-path-relative/-/cached-path-relative-1.0.1.tgz",
-      "integrity": "sha1-0JxLUoAKpMB44t2BqGmqyQ0uVOc="
-    },
-    "camelcase": {
-      "version": "1.2.1",
-      "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz",
-      "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk="
-    },
-    "caseless": {
-      "version": "0.12.0",
-      "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
-      "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
-      "optional": true
-    },
-    "center-align": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz",
-      "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=",
-      "requires": {
-        "align-text": "^0.1.3",
-        "lazy-cache": "^1.0.3"
-      }
-    },
-    "chalk": {
-      "version": "1.1.3",
-      "resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
-      "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
-      "requires": {
-        "ansi-styles": "^2.2.1",
-        "escape-string-regexp": "^1.0.2",
-        "has-ansi": "^2.0.0",
-        "strip-ansi": "^3.0.0",
-        "supports-color": "^2.0.0"
-      }
-    },
-    "character-parser": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-2.2.0.tgz",
-      "integrity": "sha1-x84o821LzZdE5f/CxfzeHHMmH8A=",
-      "requires": {
-        "is-regex": "^1.0.3"
-      }
-    },
-    "cipher-base": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
-      "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "clean-css": {
-      "version": "4.2.1",
-      "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz",
-      "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==",
-      "requires": {
-        "source-map": "~0.6.0"
-      },
-      "dependencies": {
-        "source-map": {
-          "version": "0.6.1",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
-        }
-      }
-    },
-    "cli": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
-      "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
-      "requires": {
-        "exit": "0.1.2",
-        "glob": "^7.1.1"
-      }
-    },
-    "cliui": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz",
-      "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=",
-      "requires": {
-        "center-align": "^0.1.1",
-        "right-align": "^0.1.1",
-        "wordwrap": "0.0.2"
-      }
-    },
-    "co": {
-      "version": "4.6.0",
-      "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
-      "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
-      "optional": true
-    },
-    "colors": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz",
-      "integrity": "sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs=",
-      "optional": true
-    },
-    "combine-source-map": {
-      "version": "0.8.0",
-      "resolved": "https://registry.npmjs.org/combine-source-map/-/combine-source-map-0.8.0.tgz",
-      "integrity": "sha1-pY0N8ELBhvz4IqjoAV9UUNLXmos=",
-      "requires": {
-        "convert-source-map": "~1.1.0",
-        "inline-source-map": "~0.6.0",
-        "lodash.memoize": "~3.0.3",
-        "source-map": "~0.5.3"
-      }
-    },
-    "combined-stream": {
-      "version": "1.0.7",
-      "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
-      "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
-      "optional": true,
-      "requires": {
-        "delayed-stream": "~1.0.0"
-      }
-    },
-    "commander": {
-      "version": "2.19.0",
-      "resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
-      "integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg=="
-    },
-    "concat-map": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
-      "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
-    },
-    "concat-stream": {
-      "version": "1.6.2",
-      "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
-      "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
-      "requires": {
-        "buffer-from": "^1.0.0",
-        "inherits": "^2.0.3",
-        "readable-stream": "^2.2.2",
-        "typedarray": "^0.0.6"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "console-browserify": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
-      "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
-      "requires": {
-        "date-now": "^0.1.4"
-      }
-    },
-    "constantinople": {
-      "version": "3.1.2",
-      "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.1.2.tgz",
-      "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==",
-      "requires": {
-        "@types/babel-types": "^7.0.0",
-        "@types/babylon": "^6.16.2",
-        "babel-types": "^6.26.0",
-        "babylon": "^6.18.0"
-      }
-    },
-    "constants-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
-      "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U="
-    },
-    "convert-source-map": {
-      "version": "1.1.3",
-      "resolved": "http://registry.npmjs.org/convert-source-map/-/convert-source-map-1.1.3.tgz",
-      "integrity": "sha1-SCnId+n+SbMWHzvzZziI4gRpmGA="
-    },
-    "core-js": {
-      "version": "2.5.7",
-      "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz",
-      "integrity": "sha512-RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw=="
-    },
-    "core-util-is": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
-      "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
-    },
-    "create-ecdh": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
-      "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "elliptic": "^6.0.0"
-      }
-    },
-    "create-hash": {
-      "version": "1.2.0",
-      "resolved": "http://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
-      "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
-      "requires": {
-        "cipher-base": "^1.0.1",
-        "inherits": "^2.0.1",
-        "md5.js": "^1.3.4",
-        "ripemd160": "^2.0.1",
-        "sha.js": "^2.4.0"
-      }
-    },
-    "create-hmac": {
-      "version": "1.1.7",
-      "resolved": "http://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
-      "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
-      "requires": {
-        "cipher-base": "^1.0.3",
-        "create-hash": "^1.1.0",
-        "inherits": "^2.0.1",
-        "ripemd160": "^2.0.0",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "crypto-browserify": {
-      "version": "3.12.0",
-      "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
-      "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
-      "requires": {
-        "browserify-cipher": "^1.0.0",
-        "browserify-sign": "^4.0.0",
-        "create-ecdh": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "create-hmac": "^1.1.0",
-        "diffie-hellman": "^5.0.0",
-        "inherits": "^2.0.1",
-        "pbkdf2": "^3.0.3",
-        "public-encrypt": "^4.0.0",
-        "randombytes": "^2.0.0",
-        "randomfill": "^1.0.3"
-      }
-    },
-    "css-parse": {
-      "version": "1.7.0",
-      "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz",
-      "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs="
-    },
-    "cycle": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz",
-      "integrity": "sha1-IegLK+hYD5i0aPN5QwZisEbDStI=",
-      "optional": true
-    },
-    "dashdash": {
-      "version": "1.14.1",
-      "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
-      "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
-      "optional": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "date-now": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
-      "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
-    },
-    "debug": {
-      "version": "2.6.9",
-      "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
-      "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
-      "requires": {
-        "ms": "2.0.0"
-      }
-    },
-    "decamelize": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
-      "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA="
-    },
-    "defined": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz",
-      "integrity": "sha1-yY2bzvdWdBiOEQlpFRGZ45sfppM="
-    },
-    "delayed-stream": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
-    },
-    "deps-sort": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/deps-sort/-/deps-sort-2.0.0.tgz",
-      "integrity": "sha1-CRckkC6EZYJg65EHSMzNGvbiH7U=",
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "shasum": "^1.0.0",
-        "subarg": "^1.0.0",
-        "through2": "^2.0.0"
-      }
-    },
-    "des.js": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz",
-      "integrity": "sha1-wHTS4qpqipoH29YfmhXCzYPsjsw=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0"
-      }
-    },
-    "detective": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/detective/-/detective-5.1.0.tgz",
-      "integrity": "sha512-TFHMqfOvxlgrfVzTEkNBSh9SvSNX/HfF4OFI2QFGCyPm02EsyILqnUeb5P6q7JZ3SFNTBL5t2sePRgrN4epUWQ==",
-      "requires": {
-        "acorn-node": "^1.3.0",
-        "defined": "^1.0.0",
-        "minimist": "^1.1.1"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-        }
-      }
-    },
-    "diffie-hellman": {
-      "version": "5.0.3",
-      "resolved": "http://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
-      "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "miller-rabin": "^4.0.0",
-        "randombytes": "^2.0.0"
-      }
-    },
-    "doctypes": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/doctypes/-/doctypes-1.1.0.tgz",
-      "integrity": "sha1-6oCxBqh1OHdOijpKWv4pPeSJ4Kk="
-    },
-    "dom-serializer": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz",
-      "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=",
-      "requires": {
-        "domelementtype": "~1.1.1",
-        "entities": "~1.1.1"
-      },
-      "dependencies": {
-        "domelementtype": {
-          "version": "1.1.3",
-          "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz",
-          "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs="
-        },
-        "entities": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz",
-          "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA="
-        }
-      }
-    },
-    "domelementtype": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz",
-      "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI="
-    },
-    "domhandler": {
-      "version": "2.3.0",
-      "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
-      "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
-      "requires": {
-        "domelementtype": "1"
-      }
-    },
-    "domutils": {
-      "version": "1.5.1",
-      "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
-      "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
-      "requires": {
-        "dom-serializer": "0",
-        "domelementtype": "1"
-      }
-    },
-    "duplexer2": {
-      "version": "0.1.4",
-      "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
-      "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
-      "requires": {
-        "readable-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "ecc-jsbn": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
-      "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
-      "optional": true,
-      "requires": {
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.1.0"
-      }
-    },
-    "elliptic": {
-      "version": "6.4.1",
-      "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz",
-      "integrity": "sha512-BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==",
-      "requires": {
-        "bn.js": "^4.4.0",
-        "brorand": "^1.0.1",
-        "hash.js": "^1.0.0",
-        "hmac-drbg": "^1.0.0",
-        "inherits": "^2.0.1",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.0"
-      }
-    },
-    "entities": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
-      "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
-    },
-    "es6-promise": {
-      "version": "4.2.5",
-      "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz",
-      "integrity": "sha512-n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==",
-      "optional": true
-    },
-    "escape-html": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
-      "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
-    },
-    "escape-string-regexp": {
-      "version": "1.0.5",
-      "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
-      "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ="
-    },
-    "esutils": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
-      "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs="
-    },
-    "evp_bytestokey": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
-      "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
-      "requires": {
-        "md5.js": "^1.3.4",
-        "safe-buffer": "^5.1.1"
-      }
-    },
-    "exit": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
-      "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
-    },
-    "extend": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
-      "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
-      "optional": true
-    },
-    "extract-zip": {
-      "version": "1.6.7",
-      "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz",
-      "integrity": "sha1-qEC0uK9kAyZMjbV/Txp0Mz74H+k=",
-      "optional": true,
-      "requires": {
-        "concat-stream": "1.6.2",
-        "debug": "2.6.9",
-        "mkdirp": "0.5.1",
-        "yauzl": "2.4.1"
-      }
-    },
-    "extsprintf": {
-      "version": "1.3.0",
-      "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
-      "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
-    },
-    "eyes": {
-      "version": "0.1.8",
-      "resolved": "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz",
-      "integrity": "sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A=",
-      "optional": true
-    },
-    "fast-deep-equal": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
-      "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
-      "optional": true
-    },
-    "fast-json-stable-stringify": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
-      "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
-      "optional": true
-    },
-    "fd-slicer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz",
-      "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=",
-      "optional": true,
-      "requires": {
-        "pend": "~1.2.0"
-      }
-    },
-    "forever-agent": {
-      "version": "0.6.1",
-      "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
-      "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
-      "optional": true
-    },
-    "form-data": {
-      "version": "2.3.2",
-      "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
-      "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
-      "optional": true,
-      "requires": {
-        "asynckit": "^0.4.0",
-        "combined-stream": "1.0.6",
-        "mime-types": "^2.1.12"
-      },
-      "dependencies": {
-        "combined-stream": {
-          "version": "1.0.6",
-          "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
-          "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
-          "optional": true,
-          "requires": {
-            "delayed-stream": "~1.0.0"
-          }
-        }
-      }
-    },
-    "fs-extra": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz",
-      "integrity": "sha1-zTzl9+fLYUWIP8rjGR6Yd/hYeVA=",
-      "optional": true,
-      "requires": {
-        "graceful-fs": "^4.1.2",
-        "jsonfile": "^2.1.0",
-        "klaw": "^1.0.0"
-      },
-      "dependencies": {
-        "graceful-fs": {
-          "version": "4.1.11",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-          "optional": true
-        }
-      }
-    },
-    "fs.realpath": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
-      "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
-    },
-    "function-bind": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
-      "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
-    },
-    "get-assigned-identifiers": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/get-assigned-identifiers/-/get-assigned-identifiers-1.2.0.tgz",
-      "integrity": "sha512-mBBwmeGTrxEMO4pMaaf/uUEFHnYtwr8FTe8Y/mer4rcV/bye0qGm6pw1bGZFGStxC5O76c5ZAVBGnqHmOaJpdQ=="
-    },
-    "getpass": {
-      "version": "0.1.7",
-      "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
-      "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
-      "optional": true,
-      "requires": {
-        "assert-plus": "^1.0.0"
-      }
-    },
-    "glob": {
-      "version": "7.1.3",
-      "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
-      "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
-      "requires": {
-        "fs.realpath": "^1.0.0",
-        "inflight": "^1.0.4",
-        "inherits": "2",
-        "minimatch": "^3.0.4",
-        "once": "^1.3.0",
-        "path-is-absolute": "^1.0.0"
-      }
-    },
-    "har-schema": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
-      "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
-      "optional": true
-    },
-    "har-validator": {
-      "version": "5.1.0",
-      "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
-      "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
-      "optional": true,
-      "requires": {
-        "ajv": "^5.3.0",
-        "har-schema": "^2.0.0"
-      }
-    },
-    "has": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
-      "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
-      "requires": {
-        "function-bind": "^1.1.1"
-      }
-    },
-    "has-ansi": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
-      "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "hash-base": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
-      "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "hash.js": {
-      "version": "1.1.5",
-      "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz",
-      "integrity": "sha512-eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==",
-      "requires": {
-        "inherits": "^2.0.3",
-        "minimalistic-assert": "^1.0.1"
-      }
-    },
-    "hasha": {
-      "version": "2.2.0",
-      "resolved": "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz",
-      "integrity": "sha1-eNfL/B5tZjA/55g3NlmEUXsvbuE=",
-      "optional": true,
-      "requires": {
-        "is-stream": "^1.0.1",
-        "pinkie-promise": "^2.0.0"
-      }
-    },
-    "hmac-drbg": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
-      "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
-      "requires": {
-        "hash.js": "^1.0.3",
-        "minimalistic-assert": "^1.0.0",
-        "minimalistic-crypto-utils": "^1.0.1"
-      }
-    },
-    "htmlescape": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/htmlescape/-/htmlescape-1.1.1.tgz",
-      "integrity": "sha1-OgPtwiFLyjtmQko+eVk0lQnLA1E="
-    },
-    "htmlparser2": {
-      "version": "3.8.3",
-      "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
-      "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
-      "requires": {
-        "domelementtype": "1",
-        "domhandler": "2.3",
-        "domutils": "1.5",
-        "entities": "1.0",
-        "readable-stream": "1.1"
-      }
-    },
-    "http-signature": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
-      "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
-      "optional": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "jsprim": "^1.2.2",
-        "sshpk": "^1.7.0"
-      }
-    },
-    "https-browserify": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
-      "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM="
-    },
-    "ieee754": {
-      "version": "1.1.12",
-      "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz",
-      "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA=="
-    },
-    "inflight": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
-      "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
-      "requires": {
-        "once": "^1.3.0",
-        "wrappy": "1"
-      }
-    },
-    "inherits": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
-      "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
-    },
-    "inline-source-map": {
-      "version": "0.6.2",
-      "resolved": "https://registry.npmjs.org/inline-source-map/-/inline-source-map-0.6.2.tgz",
-      "integrity": "sha1-+Tk0ccGKedFyT4Y/o4tYY3Ct4qU=",
-      "requires": {
-        "source-map": "~0.5.3"
-      }
-    },
-    "insert-module-globals": {
-      "version": "7.2.0",
-      "resolved": "https://registry.npmjs.org/insert-module-globals/-/insert-module-globals-7.2.0.tgz",
-      "integrity": "sha512-VE6NlW+WGn2/AeOMd496AHFYmE7eLKkUY6Ty31k4og5vmA3Fjuwe9v6ifH6Xx/Hz27QvdoMoviw1/pqWRB09Sw==",
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "acorn-node": "^1.5.2",
-        "combine-source-map": "^0.8.0",
-        "concat-stream": "^1.6.1",
-        "is-buffer": "^1.1.0",
-        "path-is-absolute": "^1.0.1",
-        "process": "~0.11.0",
-        "through2": "^2.0.0",
-        "undeclared-identifiers": "^1.1.2",
-        "xtend": "^4.0.0"
-      }
-    },
-    "is-buffer": {
-      "version": "1.1.6",
-      "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
-      "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
-    },
-    "is-expression": {
-      "version": "3.0.0",
-      "resolved": "https://registry.npmjs.org/is-expression/-/is-expression-3.0.0.tgz",
-      "integrity": "sha1-Oayqa+f9HzRx3ELHQW5hwkMXrJ8=",
-      "requires": {
-        "acorn": "~4.0.2",
-        "object-assign": "^4.0.1"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "4.0.13",
-          "resolved": "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz",
-          "integrity": "sha1-EFSVrlNh1pe9GVyCUZLhrX8lN4c="
-        },
-        "object-assign": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-        }
-      }
-    },
-    "is-promise": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz",
-      "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o="
-    },
-    "is-regex": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
-      "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
-      "requires": {
-        "has": "^1.0.1"
-      }
-    },
-    "is-stream": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
-      "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
-      "optional": true
-    },
-    "is-typedarray": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
-      "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
-      "optional": true
-    },
-    "isarray": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
-      "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
-    },
-    "isexe": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
-      "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
-      "optional": true
-    },
-    "isstream": {
-      "version": "0.1.2",
-      "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
-      "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
-    },
-    "js-stringify": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz",
-      "integrity": "sha1-Fzb939lyTyijaCrcYjCufk6Weds="
-    },
-    "jsbn": {
-      "version": "0.1.1",
-      "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
-      "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
-    },
-    "jshint": {
-      "version": "2.9.6",
-      "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz",
-      "integrity": "sha512-KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==",
-      "requires": {
-        "cli": "~1.0.0",
-        "console-browserify": "1.1.x",
-        "exit": "0.1.x",
-        "htmlparser2": "3.8.x",
-        "lodash": "~4.17.10",
-        "minimatch": "~3.0.2",
-        "phantom": "~4.0.1",
-        "phantomjs-prebuilt": "~2.1.7",
-        "shelljs": "0.3.x",
-        "strip-json-comments": "1.0.x",
-        "unicode-5.2.0": "^0.7.5"
-      }
-    },
-    "json-schema": {
-      "version": "0.2.3",
-      "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
-      "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
-      "optional": true
-    },
-    "json-schema-traverse": {
-      "version": "0.3.1",
-      "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
-      "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
-      "optional": true
-    },
-    "json-stable-stringify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-0.0.1.tgz",
-      "integrity": "sha1-YRwj6BTbN1Un34URk9tZ3Sryf0U=",
-      "requires": {
-        "jsonify": "~0.0.0"
-      }
-    },
-    "json-stringify-safe": {
-      "version": "5.0.1",
-      "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
-      "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
-      "optional": true
-    },
-    "jsonfile": {
-      "version": "2.4.0",
-      "resolved": "http://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz",
-      "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=",
-      "optional": true,
-      "requires": {
-        "graceful-fs": "^4.1.6"
-      },
-      "dependencies": {
-        "graceful-fs": {
-          "version": "4.1.11",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-          "optional": true
-        }
-      }
-    },
-    "jsonify": {
-      "version": "0.0.0",
-      "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz",
-      "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM="
-    },
-    "jsonparse": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz",
-      "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA="
-    },
-    "jsprim": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
-      "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
-      "optional": true,
-      "requires": {
-        "assert-plus": "1.0.0",
-        "extsprintf": "1.3.0",
-        "json-schema": "0.2.3",
-        "verror": "1.10.0"
-      }
-    },
-    "jstransformer": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-1.0.0.tgz",
-      "integrity": "sha1-7Yvwkh4vPx7U1cGkT2hwntJHIsM=",
-      "requires": {
-        "is-promise": "^2.0.0",
-        "promise": "^7.0.1"
-      }
-    },
-    "jstransformer-escape-html": {
-      "version": "1.1.0",
-      "resolved": "https://registry.npmjs.org/jstransformer-escape-html/-/jstransformer-escape-html-1.1.0.tgz",
-      "integrity": "sha1-RjnGHeTN5nmOxj2ysatNdF+RmZk=",
-      "requires": {
-        "escape-html": "^1.0.3"
-      }
-    },
-    "jstransformer-stylus": {
-      "version": "1.5.0",
-      "resolved": "https://registry.npmjs.org/jstransformer-stylus/-/jstransformer-stylus-1.5.0.tgz",
-      "integrity": "sha1-nmWpIl7aS9WGxdpp09PYZhAY6/c=",
-      "requires": {
-        "clone": "^2.0.0",
-        "stylus": "~0.54.5"
-      },
-      "dependencies": {
-        "clone": {
-          "version": "2.1.2",
-          "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
-          "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18="
-        }
-      }
-    },
-    "kew": {
-      "version": "0.7.0",
-      "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz",
-      "integrity": "sha1-edk9LTM2PW/dKXCzNdkUGtWR15s=",
-      "optional": true
-    },
-    "kind-of": {
-      "version": "3.2.2",
-      "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
-      "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
-      "requires": {
-        "is-buffer": "^1.1.5"
-      }
-    },
-    "klaw": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz",
-      "integrity": "sha1-QIhDO0azsbolnXh4XY6W9zugJDk=",
-      "optional": true,
-      "requires": {
-        "graceful-fs": "^4.1.9"
-      },
-      "dependencies": {
-        "graceful-fs": {
-          "version": "4.1.11",
-          "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
-          "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
-          "optional": true
-        }
-      }
-    },
-    "labeled-stream-splicer": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.1.tgz",
-      "integrity": "sha512-MC94mHZRvJ3LfykJlTUipBqenZz1pacOZEMhhQ8dMGcDHs0SBE5GbsavUXV7YtP3icBW17W0Zy1I0lfASmo9Pg==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "isarray": "^2.0.4",
-        "stream-splicer": "^2.0.0"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.4.tgz",
-          "integrity": "sha512-GMxXOiUirWg1xTKRipM0Ek07rX+ubx4nNVElTJdNLYmNO/2YrDkgJGw9CljXn+r4EWiDQg/8lsRdHyg2PJuUaA=="
-        }
-      }
-    },
-    "lazy-cache": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
-      "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4="
-    },
-    "lodash": {
-      "version": "4.17.11",
-      "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
-      "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg=="
-    },
-    "lodash.memoize": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-3.0.4.tgz",
-      "integrity": "sha1-LcvSwofLwKVcxCMovQxzYVDVPj8="
-    },
-    "longest": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz",
-      "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc="
-    },
-    "md5.js": {
-      "version": "1.3.5",
-      "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
-      "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "miller-rabin": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
-      "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
-      "requires": {
-        "bn.js": "^4.0.0",
-        "brorand": "^1.0.1"
-      }
-    },
-    "mime-db": {
-      "version": "1.36.0",
-      "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
-      "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw=="
-    },
-    "mime-types": {
-      "version": "2.1.20",
-      "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
-      "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
-      "requires": {
-        "mime-db": "~1.36.0"
-      }
-    },
-    "minimalistic-assert": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
-      "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A=="
-    },
-    "minimalistic-crypto-utils": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
-      "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo="
-    },
-    "minimatch": {
-      "version": "3.0.4",
-      "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
-      "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
-      "requires": {
-        "brace-expansion": "^1.1.7"
-      }
-    },
-    "minimist": {
-      "version": "0.0.8",
-      "resolved": "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
-      "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0="
-    },
-    "mkdirp": {
-      "version": "0.5.1",
-      "resolved": "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
-      "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
-      "requires": {
-        "minimist": "0.0.8"
-      }
-    },
-    "module-deps": {
-      "version": "6.1.0",
-      "resolved": "https://registry.npmjs.org/module-deps/-/module-deps-6.1.0.tgz",
-      "integrity": "sha512-NPs5N511VD1rrVJihSso/LiBShRbJALYBKzDW91uZYy7BpjnO4bGnZL3HjZ9yKcFdZUWwaYjDz9zxbuP7vKMuQ==",
-      "requires": {
-        "JSONStream": "^1.0.3",
-        "browser-resolve": "^1.7.0",
-        "cached-path-relative": "^1.0.0",
-        "concat-stream": "~1.6.0",
-        "defined": "^1.0.0",
-        "detective": "^5.0.2",
-        "duplexer2": "^0.1.2",
-        "inherits": "^2.0.1",
-        "parents": "^1.0.0",
-        "readable-stream": "^2.0.2",
-        "resolve": "^1.4.0",
-        "stream-combiner2": "^1.1.1",
-        "subarg": "^1.0.0",
-        "through2": "^2.0.0",
-        "xtend": "^4.0.0"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "ms": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
-      "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
-    },
-    "oauth-sign": {
-      "version": "0.9.0",
-      "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
-      "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
-      "optional": true
-    },
-    "once": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
-      "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
-      "requires": {
-        "wrappy": "1"
-      }
-    },
-    "os-browserify": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
-      "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc="
-    },
-    "pako": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz",
-      "integrity": "sha512-lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg=="
-    },
-    "parents": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/parents/-/parents-1.0.1.tgz",
-      "integrity": "sha1-/t1NK/GTp3dF/nHjcdc8MwfZx1E=",
-      "requires": {
-        "path-platform": "~0.11.15"
-      }
-    },
-    "parse-asn1": {
-      "version": "5.1.1",
-      "resolved": "http://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz",
-      "integrity": "sha512-KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==",
-      "requires": {
-        "asn1.js": "^4.0.0",
-        "browserify-aes": "^1.0.0",
-        "create-hash": "^1.1.0",
-        "evp_bytestokey": "^1.0.0",
-        "pbkdf2": "^3.0.3"
-      }
-    },
-    "path-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
-      "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ=="
-    },
-    "path-is-absolute": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
-      "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
-    },
-    "path-parse": {
-      "version": "1.0.6",
-      "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
-      "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw=="
-    },
-    "path-platform": {
-      "version": "0.11.15",
-      "resolved": "https://registry.npmjs.org/path-platform/-/path-platform-0.11.15.tgz",
-      "integrity": "sha1-6GQhf3TDaFDwhSt43Hv31KVyG/I="
-    },
-    "pbkdf2": {
-      "version": "3.0.17",
-      "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
-      "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
-      "requires": {
-        "create-hash": "^1.1.2",
-        "create-hmac": "^1.1.4",
-        "ripemd160": "^2.0.1",
-        "safe-buffer": "^5.0.1",
-        "sha.js": "^2.4.8"
-      }
-    },
-    "pend": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
-      "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
-      "optional": true
-    },
-    "performance-now": {
-      "version": "2.1.0",
-      "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
-      "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
-      "optional": true
-    },
-    "phantom": {
-      "version": "4.0.12",
-      "resolved": "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz",
-      "integrity": "sha512-Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==",
-      "optional": true,
-      "requires": {
-        "phantomjs-prebuilt": "^2.1.16",
-        "split": "^1.0.1",
-        "winston": "^2.4.0"
-      }
-    },
-    "phantomjs-prebuilt": {
-      "version": "2.1.16",
-      "resolved": "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz",
-      "integrity": "sha1-79ISpKOWbTZHaE6ouniFSb4q7+8=",
-      "optional": true,
-      "requires": {
-        "es6-promise": "^4.0.3",
-        "extract-zip": "^1.6.5",
-        "fs-extra": "^1.0.0",
-        "hasha": "^2.2.0",
-        "kew": "^0.7.0",
-        "progress": "^1.1.8",
-        "request": "^2.81.0",
-        "request-progress": "^2.0.1",
-        "which": "^1.2.10"
-      }
-    },
-    "pinkie": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
-      "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
-      "optional": true
-    },
-    "pinkie-promise": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
-      "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
-      "optional": true,
-      "requires": {
-        "pinkie": "^2.0.0"
-      }
-    },
-    "process": {
-      "version": "0.11.10",
-      "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
-      "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI="
-    },
-    "process-nextick-args": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
-      "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw=="
-    },
-    "progress": {
-      "version": "1.1.8",
-      "resolved": "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz",
-      "integrity": "sha1-4mDHj2Fhzdmw5WzD4Khd4Xx6V74=",
-      "optional": true
-    },
-    "promise": {
-      "version": "7.3.1",
-      "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz",
-      "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==",
-      "requires": {
-        "asap": "~2.0.3"
-      }
-    },
-    "psl": {
-      "version": "1.1.29",
-      "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
-      "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
-      "optional": true
-    },
-    "public-encrypt": {
-      "version": "4.0.3",
-      "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
-      "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
-      "requires": {
-        "bn.js": "^4.1.0",
-        "browserify-rsa": "^4.0.0",
-        "create-hash": "^1.1.0",
-        "parse-asn1": "^5.0.0",
-        "randombytes": "^2.0.1",
-        "safe-buffer": "^5.1.2"
-      }
-    },
-    "pug": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/pug/-/pug-2.0.3.tgz",
-      "integrity": "sha1-ccuoJTfJWl6rftBGluQiH1Oqh44=",
-      "requires": {
-        "pug-code-gen": "^2.0.1",
-        "pug-filters": "^3.1.0",
-        "pug-lexer": "^4.0.0",
-        "pug-linker": "^3.0.5",
-        "pug-load": "^2.0.11",
-        "pug-parser": "^5.0.0",
-        "pug-runtime": "^2.0.4",
-        "pug-strip-comments": "^1.0.3"
-      }
-    },
-    "pug-attrs": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/pug-attrs/-/pug-attrs-2.0.3.tgz",
-      "integrity": "sha1-owlflw5kFR972tlX7vVftdeQXRU=",
-      "requires": {
-        "constantinople": "^3.0.1",
-        "js-stringify": "^1.0.1",
-        "pug-runtime": "^2.0.4"
-      }
-    },
-    "pug-cli": {
-      "version": "1.0.0-alpha6",
-      "resolved": "https://registry.npmjs.org/pug-cli/-/pug-cli-1.0.0-alpha6.tgz",
-      "integrity": "sha1-HKU56krA67ac5KroSu7V1k/+ZQE=",
-      "requires": {
-        "chalk": "^1.0.0",
-        "commander": "^2.8.1",
-        "mkdirp": "^0.5.1",
-        "pug": "^2.0.0-alpha7"
-      }
-    },
-    "pug-code-gen": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/pug-code-gen/-/pug-code-gen-2.0.1.tgz",
-      "integrity": "sha1-CVHsgyJddNjPxHan+Zolm199BQw=",
-      "requires": {
-        "constantinople": "^3.0.1",
-        "doctypes": "^1.1.0",
-        "js-stringify": "^1.0.1",
-        "pug-attrs": "^2.0.3",
-        "pug-error": "^1.3.2",
-        "pug-runtime": "^2.0.4",
-        "void-elements": "^2.0.1",
-        "with": "^5.0.0"
-      }
-    },
-    "pug-error": {
-      "version": "1.3.2",
-      "resolved": "https://registry.npmjs.org/pug-error/-/pug-error-1.3.2.tgz",
-      "integrity": "sha1-U659nSm7A89WRJOgJhCfVMR/XyY="
-    },
-    "pug-filters": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmjs.org/pug-filters/-/pug-filters-3.1.0.tgz",
-      "integrity": "sha1-JxZVVbwEwjbkqisDZiRt+gIbYm4=",
-      "requires": {
-        "clean-css": "^4.1.11",
-        "constantinople": "^3.0.1",
-        "jstransformer": "1.0.0",
-        "pug-error": "^1.3.2",
-        "pug-walk": "^1.1.7",
-        "resolve": "^1.1.6",
-        "uglify-js": "^2.6.1"
-      },
-      "dependencies": {
-        "uglify-js": {
-          "version": "2.8.29",
-          "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz",
-          "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=",
-          "requires": {
-            "source-map": "~0.5.1",
-            "uglify-to-browserify": "~1.0.0",
-            "yargs": "~3.10.0"
-          }
-        }
-      }
-    },
-    "pug-lexer": {
-      "version": "4.0.0",
-      "resolved": "https://registry.npmjs.org/pug-lexer/-/pug-lexer-4.0.0.tgz",
-      "integrity": "sha1-IQwYRX7y4XYCQnQMXmR715TOwng=",
-      "requires": {
-        "character-parser": "^2.1.1",
-        "is-expression": "^3.0.0",
-        "pug-error": "^1.3.2"
-      }
-    },
-    "pug-linker": {
-      "version": "3.0.5",
-      "resolved": "https://registry.npmjs.org/pug-linker/-/pug-linker-3.0.5.tgz",
-      "integrity": "sha1-npp65ABWgtAn3uuWsAD4juuDoC8=",
-      "requires": {
-        "pug-error": "^1.3.2",
-        "pug-walk": "^1.1.7"
-      }
-    },
-    "pug-load": {
-      "version": "2.0.11",
-      "resolved": "https://registry.npmjs.org/pug-load/-/pug-load-2.0.11.tgz",
-      "integrity": "sha1-5kjlftET/iwfRdV4WOorrWvAFSc=",
-      "requires": {
-        "object-assign": "^4.1.0",
-        "pug-walk": "^1.1.7"
-      },
-      "dependencies": {
-        "object-assign": {
-          "version": "4.1.1",
-          "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
-          "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
-        }
-      }
-    },
-    "pug-parser": {
-      "version": "5.0.0",
-      "resolved": "https://registry.npmjs.org/pug-parser/-/pug-parser-5.0.0.tgz",
-      "integrity": "sha1-45Stmz/KkxI5QK/4hcBuRKt+aOQ=",
-      "requires": {
-        "pug-error": "^1.3.2",
-        "token-stream": "0.0.1"
-      }
-    },
-    "pug-runtime": {
-      "version": "2.0.4",
-      "resolved": "https://registry.npmjs.org/pug-runtime/-/pug-runtime-2.0.4.tgz",
-      "integrity": "sha1-4XjhvaaKsujArPybztLFT9iM61g="
-    },
-    "pug-strip-comments": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/pug-strip-comments/-/pug-strip-comments-1.0.3.tgz",
-      "integrity": "sha1-8VWVkiBu3G+FMQ2s9K+0igJa9Z8=",
-      "requires": {
-        "pug-error": "^1.3.2"
-      }
-    },
-    "pug-walk": {
-      "version": "1.1.7",
-      "resolved": "https://registry.npmjs.org/pug-walk/-/pug-walk-1.1.7.tgz",
-      "integrity": "sha1-wA1cUSi6xYBr7BXSt+fNq+QlMfM="
-    },
-    "punycode": {
-      "version": "1.4.1",
-      "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
-      "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4="
-    },
-    "qs": {
-      "version": "6.5.2",
-      "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
-      "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
-      "optional": true
-    },
-    "querystring": {
-      "version": "0.2.0",
-      "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
-      "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA="
-    },
-    "querystring-es3": {
-      "version": "0.2.1",
-      "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
-      "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM="
-    },
-    "randombytes": {
-      "version": "2.0.6",
-      "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz",
-      "integrity": "sha512-CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==",
-      "requires": {
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "randomfill": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
-      "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
-      "requires": {
-        "randombytes": "^2.0.5",
-        "safe-buffer": "^5.1.0"
-      }
-    },
-    "read-only-stream": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/read-only-stream/-/read-only-stream-2.0.0.tgz",
-      "integrity": "sha1-JyT9aoET1zdkrCiNQ4YnDB2/F/A=",
-      "requires": {
-        "readable-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "readable-stream": {
-      "version": "1.1.14",
-      "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
-      "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
-      "requires": {
-        "core-util-is": "~1.0.0",
-        "inherits": "~2.0.1",
-        "isarray": "0.0.1",
-        "string_decoder": "~0.10.x"
-      }
-    },
-    "regenerator-runtime": {
-      "version": "0.11.1",
-      "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
-      "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg=="
-    },
-    "repeat-string": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
-      "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc="
-    },
-    "request": {
-      "version": "2.88.0",
-      "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
-      "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
-      "optional": true,
-      "requires": {
-        "aws-sign2": "~0.7.0",
-        "aws4": "^1.8.0",
-        "caseless": "~0.12.0",
-        "combined-stream": "~1.0.6",
-        "extend": "~3.0.2",
-        "forever-agent": "~0.6.1",
-        "form-data": "~2.3.2",
-        "har-validator": "~5.1.0",
-        "http-signature": "~1.2.0",
-        "is-typedarray": "~1.0.0",
-        "isstream": "~0.1.2",
-        "json-stringify-safe": "~5.0.1",
-        "mime-types": "~2.1.19",
-        "oauth-sign": "~0.9.0",
-        "performance-now": "^2.1.0",
-        "qs": "~6.5.2",
-        "safe-buffer": "^5.1.2",
-        "tough-cookie": "~2.4.3",
-        "tunnel-agent": "^0.6.0",
-        "uuid": "^3.3.2"
-      }
-    },
-    "request-progress": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz",
-      "integrity": "sha1-XTa7V5YcZzqlt4jbyBQf3yO0Tgg=",
-      "optional": true,
-      "requires": {
-        "throttleit": "^1.0.0"
-      }
-    },
-    "resolve": {
-      "version": "1.8.1",
-      "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz",
-      "integrity": "sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==",
-      "requires": {
-        "path-parse": "^1.0.5"
-      }
-    },
-    "right-align": {
-      "version": "0.1.3",
-      "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz",
-      "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=",
-      "requires": {
-        "align-text": "^0.1.1"
-      }
-    },
-    "ripemd160": {
-      "version": "2.0.2",
-      "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
-      "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
-      "requires": {
-        "hash-base": "^3.0.0",
-        "inherits": "^2.0.1"
-      }
-    },
-    "safe-buffer": {
-      "version": "5.1.2",
-      "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
-      "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
-    },
-    "safer-buffer": {
-      "version": "2.1.2",
-      "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
-      "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
-    },
-    "sax": {
-      "version": "0.5.8",
-      "resolved": "http://registry.npmjs.org/sax/-/sax-0.5.8.tgz",
-      "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE="
-    },
-    "sha.js": {
-      "version": "2.4.11",
-      "resolved": "http://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
-      "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
-      "requires": {
-        "inherits": "^2.0.1",
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "shasum": {
-      "version": "1.0.2",
-      "resolved": "http://registry.npmjs.org/shasum/-/shasum-1.0.2.tgz",
-      "integrity": "sha1-5wEjENj0F/TetXEhUOVni4euVl8=",
-      "requires": {
-        "json-stable-stringify": "~0.0.0",
-        "sha.js": "~2.4.4"
-      }
-    },
-    "shell-quote": {
-      "version": "1.6.1",
-      "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz",
-      "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=",
-      "requires": {
-        "array-filter": "~0.0.0",
-        "array-map": "~0.0.0",
-        "array-reduce": "~0.0.0",
-        "jsonify": "~0.0.0"
-      }
-    },
-    "shelljs": {
-      "version": "0.3.0",
-      "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
-      "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E="
-    },
-    "simple-concat": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.0.tgz",
-      "integrity": "sha1-c0TLuLbib7J9ZrL8hvn21Zl1IcY="
-    },
-    "source-map": {
-      "version": "0.5.7",
-      "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
-      "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w="
-    },
-    "split": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
-      "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
-      "optional": true,
-      "requires": {
-        "through": "2"
-      }
-    },
-    "sshpk": {
-      "version": "1.15.1",
-      "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz",
-      "integrity": "sha512-mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==",
-      "optional": true,
-      "requires": {
-        "asn1": "~0.2.3",
-        "assert-plus": "^1.0.0",
-        "bcrypt-pbkdf": "^1.0.0",
-        "dashdash": "^1.12.0",
-        "ecc-jsbn": "~0.1.1",
-        "getpass": "^0.1.1",
-        "jsbn": "~0.1.0",
-        "safer-buffer": "^2.0.2",
-        "tweetnacl": "~0.14.0"
-      }
-    },
-    "stack-trace": {
-      "version": "0.0.10",
-      "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
-      "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=",
-      "optional": true
-    },
-    "stream-browserify": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz",
-      "integrity": "sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=",
-      "requires": {
-        "inherits": "~2.0.1",
-        "readable-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "stream-combiner2": {
-      "version": "1.1.1",
-      "resolved": "https://registry.npmjs.org/stream-combiner2/-/stream-combiner2-1.1.1.tgz",
-      "integrity": "sha1-+02KFCDqNidk4hrUeAOXvry0HL4=",
-      "requires": {
-        "duplexer2": "~0.1.0",
-        "readable-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "stream-http": {
-      "version": "2.8.3",
-      "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
-      "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
-      "requires": {
-        "builtin-status-codes": "^3.0.0",
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.3.6",
-        "to-arraybuffer": "^1.0.0",
-        "xtend": "^4.0.0"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "stream-splicer": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/stream-splicer/-/stream-splicer-2.0.0.tgz",
-      "integrity": "sha1-G2O+Q4oTPktnHMGTUZdgAXWRDYM=",
-      "requires": {
-        "inherits": "^2.0.1",
-        "readable-stream": "^2.0.2"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "string_decoder": {
-      "version": "0.10.31",
-      "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
-      "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
-    },
-    "strip-ansi": {
-      "version": "3.0.1",
-      "resolved": "http://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
-      "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
-      "requires": {
-        "ansi-regex": "^2.0.0"
-      }
-    },
-    "strip-json-comments": {
-      "version": "1.0.4",
-      "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
-      "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E="
-    },
-    "stylus": {
-      "version": "0.54.5",
-      "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz",
-      "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=",
-      "requires": {
-        "css-parse": "1.7.x",
-        "debug": "*",
-        "glob": "7.0.x",
-        "mkdirp": "0.5.x",
-        "sax": "0.5.x",
-        "source-map": "0.1.x"
-      },
-      "dependencies": {
-        "glob": {
-          "version": "7.0.6",
-          "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz",
-          "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=",
-          "requires": {
-            "fs.realpath": "^1.0.0",
-            "inflight": "^1.0.4",
-            "inherits": "2",
-            "minimatch": "^3.0.2",
-            "once": "^1.3.0",
-            "path-is-absolute": "^1.0.0"
-          }
-        },
-        "source-map": {
-          "version": "0.1.43",
-          "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz",
-          "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=",
-          "requires": {
-            "amdefine": ">=0.0.4"
-          }
-        }
-      }
-    },
-    "subarg": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz",
-      "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=",
-      "requires": {
-        "minimist": "^1.1.0"
-      },
-      "dependencies": {
-        "minimist": {
-          "version": "1.2.0",
-          "resolved": "http://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
-          "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
-        }
-      }
-    },
-    "supports-color": {
-      "version": "2.0.0",
-      "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
-      "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
-    },
-    "syntax-error": {
-      "version": "1.4.0",
-      "resolved": "https://registry.npmjs.org/syntax-error/-/syntax-error-1.4.0.tgz",
-      "integrity": "sha512-YPPlu67mdnHGTup2A8ff7BC2Pjq0e0Yp/IyTFN03zWO0RcK07uLcbi7C2KpGR2FvWbaB0+bfE27a+sBKebSo7w==",
-      "requires": {
-        "acorn-node": "^1.2.0"
-      }
-    },
-    "throttleit": {
-      "version": "1.0.0",
-      "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz",
-      "integrity": "sha1-nnhYNtr0Z0MUWlmEtiaNgoUorGw=",
-      "optional": true
-    },
-    "through": {
-      "version": "2.3.8",
-      "resolved": "http://registry.npmjs.org/through/-/through-2.3.8.tgz",
-      "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
-    },
-    "through2": {
-      "version": "2.0.3",
-      "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
-      "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
-      "requires": {
-        "readable-stream": "^2.1.5",
-        "xtend": "~4.0.1"
-      },
-      "dependencies": {
-        "isarray": {
-          "version": "1.0.0",
-          "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
-          "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE="
-        },
-        "readable-stream": {
-          "version": "2.3.6",
-          "resolved": "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
-          "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
-          "requires": {
-            "core-util-is": "~1.0.0",
-            "inherits": "~2.0.3",
-            "isarray": "~1.0.0",
-            "process-nextick-args": "~2.0.0",
-            "safe-buffer": "~5.1.1",
-            "string_decoder": "~1.1.1",
-            "util-deprecate": "~1.0.1"
-          }
-        },
-        "string_decoder": {
-          "version": "1.1.1",
-          "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
-          "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
-          "requires": {
-            "safe-buffer": "~5.1.0"
-          }
-        }
-      }
-    },
-    "timers-browserify": {
-      "version": "1.4.2",
-      "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-1.4.2.tgz",
-      "integrity": "sha1-ycWLV1voQHN1y14kYtrO50NZ9B0=",
-      "requires": {
-        "process": "~0.11.0"
-      }
-    },
-    "to-arraybuffer": {
-      "version": "1.0.1",
-      "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
-      "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M="
-    },
-    "to-fast-properties": {
-      "version": "1.0.3",
-      "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
-      "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc="
-    },
-    "token-stream": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/token-stream/-/token-stream-0.0.1.tgz",
-      "integrity": "sha1-zu78cXp2xDFvEm0LnbqlXX598Bo="
-    },
-    "tough-cookie": {
-      "version": "2.4.3",
-      "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
-      "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
-      "optional": true,
-      "requires": {
-        "psl": "^1.1.24",
-        "punycode": "^1.4.1"
-      }
-    },
-    "tty-browserify": {
-      "version": "0.0.1",
-      "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.1.tgz",
-      "integrity": "sha512-C3TaO7K81YvjCgQH9Q1S3R3P3BtN3RIM8n+OvX4il1K1zgE8ZhI0op7kClgkxtutIE8hQrcrHBXvIheqKUUCxw=="
-    },
-    "tunnel-agent": {
-      "version": "0.6.0",
-      "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
-      "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
-      "optional": true,
-      "requires": {
-        "safe-buffer": "^5.0.1"
-      }
-    },
-    "tweetnacl": {
-      "version": "0.14.5",
-      "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
-      "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
-    },
-    "typedarray": {
-      "version": "0.0.6",
-      "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
-      "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c="
-    },
-    "uglify-to-browserify": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz",
-      "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=",
-      "optional": true
-    },
-    "umd": {
-      "version": "3.0.3",
-      "resolved": "https://registry.npmjs.org/umd/-/umd-3.0.3.tgz",
-      "integrity": "sha512-4IcGSufhFshvLNcMCV80UnQVlZ5pMOC8mvNPForqwA4+lzYQuetTESLDQkeLmihq8bRcnpbQa48Wb8Lh16/xow=="
-    },
-    "undeclared-identifiers": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/undeclared-identifiers/-/undeclared-identifiers-1.1.2.tgz",
-      "integrity": "sha512-13EaeocO4edF/3JKime9rD7oB6QI8llAGhgn5fKOPyfkJbRb6NFv9pYV6dFEmpa4uRjKeBqLZP8GpuzqHlKDMQ==",
-      "requires": {
-        "acorn-node": "^1.3.0",
-        "get-assigned-identifiers": "^1.2.0",
-        "simple-concat": "^1.0.0",
-        "xtend": "^4.0.1"
-      }
-    },
-    "unicode-5.2.0": {
-      "version": "0.7.5",
-      "resolved": "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz",
-      "integrity": "sha512-KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA=="
-    },
-    "url": {
-      "version": "0.11.0",
-      "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
-      "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
-      "requires": {
-        "punycode": "1.3.2",
-        "querystring": "0.2.0"
-      },
-      "dependencies": {
-        "punycode": {
-          "version": "1.3.2",
-          "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
-          "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0="
-        }
-      }
-    },
-    "util": {
-      "version": "0.10.4",
-      "resolved": "https://registry.npmjs.org/util/-/util-0.10.4.tgz",
-      "integrity": "sha512-0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==",
-      "requires": {
-        "inherits": "2.0.3"
-      }
-    },
-    "util-deprecate": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
-      "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8="
-    },
-    "uuid": {
-      "version": "3.3.2",
-      "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
-      "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
-      "optional": true
-    },
-    "verror": {
-      "version": "1.10.0",
-      "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
-      "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
-      "optional": true,
-      "requires": {
-        "assert-plus": "^1.0.0",
-        "core-util-is": "1.0.2",
-        "extsprintf": "^1.2.0"
-      }
-    },
-    "void-elements": {
-      "version": "2.0.1",
-      "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz",
-      "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w="
-    },
-    "which": {
-      "version": "1.3.1",
-      "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
-      "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
-      "optional": true,
-      "requires": {
-        "isexe": "^2.0.0"
-      }
-    },
-    "window-size": {
-      "version": "0.1.0",
-      "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz",
-      "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0="
-    },
-    "winston": {
-      "version": "2.4.4",
-      "resolved": "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz",
-      "integrity": "sha512-NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==",
-      "optional": true,
-      "requires": {
-        "async": "~1.0.0",
-        "colors": "1.0.x",
-        "cycle": "1.0.x",
-        "eyes": "0.1.x",
-        "isstream": "0.1.x",
-        "stack-trace": "0.0.x"
-      }
-    },
-    "with": {
-      "version": "5.1.1",
-      "resolved": "https://registry.npmjs.org/with/-/with-5.1.1.tgz",
-      "integrity": "sha1-+k2qktrzLE6pTtRTyB8EaGtXXf4=",
-      "requires": {
-        "acorn": "^3.1.0",
-        "acorn-globals": "^3.0.0"
-      },
-      "dependencies": {
-        "acorn": {
-          "version": "3.3.0",
-          "resolved": "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz",
-          "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo="
-        }
-      }
-    },
-    "wordwrap": {
-      "version": "0.0.2",
-      "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz",
-      "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8="
-    },
-    "wrappy": {
-      "version": "1.0.2",
-      "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
-      "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
-    },
-    "xtend": {
-      "version": "4.0.1",
-      "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
-      "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
-    },
-    "yargs": {
-      "version": "3.10.0",
-      "resolved": "http://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz",
-      "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=",
-      "requires": {
-        "camelcase": "^1.0.2",
-        "cliui": "^2.1.0",
-        "decamelize": "^1.0.0",
-        "window-size": "0.1.0"
-      }
-    },
-    "yauzl": {
-      "version": "2.4.1",
-      "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz",
-      "integrity": "sha1-lSj0QtqxsihOWLQ3m7GU4i4MQAU=",
-      "optional": true,
-      "requires": {
-        "fd-slicer": "~1.0.1"
-      }
-    }
-  }
-}
index 1ca3f5f5b538162661870d8e978e27841d6a83b1..1e0e46260fef799082d0bae8ba8edb6213da8e30 100644 (file)
@@ -1,6 +1,6 @@
 {
   "name": "bbctrl",
-  "version": "0.4.5",
+  "version": "0.4.6",
   "homepage": "http://buildbotics.com/",
   "repository": "https://github.com/buildbotics/bbctrl-firmware",
   "license": "GPL-3.0+",
index e67266909b805fd414f3dc7c5d0935308eb0b7e7..89c8b28cf79a2d90373b7143c1c513ebc2cb891c 100755 (executable)
@@ -10,7 +10,7 @@ apt-get dist-upgrade -y
 # Install packages
 apt-get install -y avahi-daemon avrdude minicom python3-pip python3-smbus \
   i2c-tools python3-rpi.gpio libjpeg8 wiringpi dnsmasq hostapd \
-  iptables-persistent chromium-browser xorg rpd-plym-splash
+  iptables-persistent chromium-browser xorg rpd-plym-splash samba
 pip3 install --upgrade tornado sockjs-tornado pyserial
 
 # Clean
@@ -90,6 +90,10 @@ cp -av /mnt/host/splash/* /usr/share/plymouth/themes/buildbotics/
 echo -n " quiet splash logo.nologo plymouth.ignore-serial-consoles" >> /boot/cmdline.txt
 plymouth-set-default-theme -R buildbotics
 
+# Samba
+# TODO install custom smb.conf
+smbpasswd -a bbmc
+
 # Install bbctrl
 tar xf /mnt/host/bbctrl-*.tar.bz2
 cd $(basename bbctrl-*.tar.bz2 .tar.bz2)
index 498a297337fdfd6faa8e763703a3c242ccd2d049..a9d65dcaf07bab5d63f9277c400d4211bca9cd38 100644 (file)
 #include "base64.h"
 #include "rtc.h"
 #include "stepper.h"
+#include "log.h"
 #include "cpp_magic.h"
 
-#ifdef __AVR__
 #include <util/atomic.h>
-#else
-#define ATOMIC_BLOCK(x)
-#define ATOMIC_RESTORESTATE
-#endif
 
 #include <stdio.h>
 #include <string.h>
 #include <stdlib.h>
 
 
-#ifdef __AVR__
 #define RING_BUF_ATOMIC_COPY(TO, FROM)          \
   ATOMIC_BLOCK(ATOMIC_RESTORESTATE) TO = FROM
-#endif
 
 #define RING_BUF_NAME sync_q
 #define RING_BUF_TYPE uint8_t
@@ -264,6 +258,7 @@ uint8_t *command_next() {
 // Called by exec.c from low-level interrupt
 bool command_exec() {
   if (!cmd.count) {
+    // TODO If MIN_VELOCITY < velocity then we have a potential buffer underrun
     cmd.last_empty = rtc_get_time();
     exec_set_velocity(0);
     state_idle();
index 2ddcae7621ab8240ab726a05f95c90b3319e9247..24fa928f4c0e0c166c3a455ec229c84ad73f7aa4 100644 (file)
@@ -31,6 +31,7 @@
 #include "status.h"
 
 #include <stdbool.h>
+#include <stdint.h>
 
 
 // Commands
index d86a810f7ad1cbad2be51d5e799d8babc49d5da9..7c2c3e492d7388892ce6bc9194ef346f8af2f4b7 100644 (file)
@@ -29,9 +29,7 @@
 
 #include "pins.h"
 
-#ifdef __AVR__
 #include <avr/interrupt.h>
-#endif
 
 
 // Pins
index f4fb2ca9c0eb8a6434d3e9f103492b4241be38b8..f4403888a5ed1633e8e355617565f079b12dcbd9 100644 (file)
@@ -36,6 +36,7 @@
 #include <string.h>
 #include <stdlib.h>
 #include <stdio.h>
+#include <math.h>
 
 
 #define DRIVERS MOTORS
diff --git a/src/avr/src/emu.h b/src/avr/src/emu.h
new file mode 100644 (file)
index 0000000..cb3d605
--- /dev/null
@@ -0,0 +1,36 @@
+/******************************************************************************\
+
+                 This file is part of the Buildbotics firmware.
+
+                   Copyright (c) 2015 - 2018, Buildbotics LLC
+                              All rights reserved.
+
+      This file ("the software") is free software: you can redistribute it
+      and/or modify it under the terms of the GNU General Public License,
+       version 2 as published by the Free Software Foundation. You should
+       have received a copy of the GNU General Public License, version 2
+      along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+      The software 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
+                Lesser General Public License for more details.
+
+        You should have received a copy of the GNU Lesser General Public
+                 License along with the software.  If not, see
+                        <http://www.gnu.org/licenses/>.
+
+                 For information regarding this software email:
+                   "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#ifdef __AVR__
+#define emu_init()
+#define emu_callback()
+
+#else
+void emu_init();
+void emu_callback();
+
+#endif
index 282f31f21ee108c185504dbcf64034c3c0c557de..b4ad4450a143093cc06452572e795ecab2d15e64 100644 (file)
@@ -205,8 +205,6 @@ stat_t _segment_exec() {
 stat_t exec_segment(float time, const float target[], float vel, float accel,
                     float maxAccel, float maxJerk,
                     const power_update_t power_updates[]) {
-  ESTOP_ASSERT(time <= SEGMENT_TIME, STAT_SHORT_SEG_TIME);
-
   // Copy power updates in to the correct position given the time offset
   float nextT = ex.seg.time + time;
   const float stepT = 1.0 / 60000; // 1ms in mins
index ae7a2b37713a2e462b1e924bccec4164b7ef780f..ec18f75f2444d3a74b78cbec84de5e12cc928cda 100644 (file)
@@ -80,6 +80,7 @@ static void _init_clock()  {
 }
 
 
+#ifdef __AVR__
 static void _load_hw_id_byte(int i, register8_t *reg) {
   NVM.CMD = NVM_CMD_READ_CALIB_ROW_gc;
   uint8_t byte = pgm_read_byte(reg);
@@ -88,9 +89,11 @@ static void _load_hw_id_byte(int i, register8_t *reg) {
   hw.id[i] = HEXNIB(byte >> 4);
   hw.id[i + 1] = HEXNIB(byte);
 }
+#endif // __AVR__
 
 
 static void _read_hw_id() {
+#ifdef __AVR__
   int i = 0;
   _load_hw_id_byte(i, &PROD_SIGS.LOTNUM5); i += 2;
   _load_hw_id_byte(i, &PROD_SIGS.LOTNUM4); i += 2;
@@ -107,6 +110,12 @@ static void _read_hw_id() {
   _load_hw_id_byte(i, &PROD_SIGS.COORDY1); i += 2;
   _load_hw_id_byte(i, &PROD_SIGS.COORDY0); i += 2;
   hw.id[i] = 0;
+
+#else // __AVR__
+  for (int i = 0; i < 25; i++)
+    hw.id[i] = '0';
+  hw.id[25] = 0;
+#endif // __AVR__
 }
 
 
index 3c0253924aa73db5311b9226d6d49e2032e453d2..84597b82a181907762449802646ec7c01ceb90a0 100644 (file)
@@ -297,4 +297,4 @@ uint16_t get_hy_temp() {return hy.temperature;}
 float get_hy_max_freq() {return hy.max_freq;}
 float get_hy_min_freq() {return hy.min_freq;}
 uint16_t get_hy_rated_rpm() {return hy.rated_rpm;}
-float get_hy_status() {return hy.status;}
+uint8_t get_hy_status() {return hy.status;}
index 16e5bf79b473db550f02951959fc17d136bf1da1..64df0355da71061ff208c89ed4bb0bc240cef9c6 100644 (file)
 #include <stdlib.h>
 
 
-static struct {
+typedef struct {
   bool holding;
   bool writing;
 
   SCurve scurves[AXES];
   float next[AXES];
   float targetV[AXES];
-} jr;
+} jr_t;
+
+jr_t jr = {0};
 
 
 stat_t jog_exec() {
index 2dbabf4732831b508851114ff380c9c63d8ed08a..7802eb46df057c8222674b0195f087a3172af8c1 100644 (file)
@@ -62,14 +62,21 @@ void lcd_init(uint8_t addr) {
 }
 
 
+static void _master_wait() {
+#ifdef __AVR__
+  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm)) continue;
+#endif
+}
+
+
 static void _write_i2c(uint8_t addr, uint8_t data) {
   data |= BACKLIGHT_BIT;
 
   TWIC.MASTER.ADDR = addr << 1;
-  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm)) continue;
+  _master_wait();
 
   TWIC.MASTER.DATA = data;
-  while (!(TWIC.MASTER.STATUS & TWI_MASTER_WIF_bm)) continue;
+  _master_wait();
 
   TWIC.MASTER.CTRLC = TWI_MASTER_CMD_STOP_gc;
 
diff --git a/src/avr/src/log.h b/src/avr/src/log.h
new file mode 100644 (file)
index 0000000..36c353b
--- /dev/null
@@ -0,0 +1,35 @@
+/******************************************************************************\
+
+                 This file is part of the Buildbotics firmware.
+
+                   Copyright (c) 2015 - 2018, Buildbotics LLC
+                              All rights reserved.
+
+      This file ("the software") is free software: you can redistribute it
+      and/or modify it under the terms of the GNU General Public License,
+       version 2 as published by the Free Software Foundation. You should
+       have received a copy of the GNU General Public License, version 2
+      along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+      The software 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
+                Lesser General Public License for more details.
+
+        You should have received a copy of the GNU Lesser General Public
+                 License along with the software.  If not, see
+                        <http://www.gnu.org/licenses/>.
+
+                 For information regarding this software email:
+                   "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#pragma once
+
+#ifdef __AVR__
+#define LOG(...)
+#else
+#include <stdio.h>
+#define LOG(...) fprintf(stderr, __VA_ARGS__)
+#endif
index f93bcf5898c8877104de2fd511560f8e19ba24c8..7908fc6f9315c89cc0af59d7d65622b65b5057d2 100644 (file)
@@ -42,6 +42,7 @@
 #include "analog.h"
 #include "exec.h"
 #include "state.h"
+#include "emu.h"
 
 #include <avr/wdt.h>
 
@@ -55,6 +56,7 @@ int main() {
   // Init
   cli();                          // disable interrupts
 
+  emu_init();                     // Init emulator
   hw_init();                      // hardware setup - must be first
   outputs_init();                 // output pins
   analog_init();                  // analog input pins
@@ -76,6 +78,7 @@ int main() {
 
   // Main loop
   while (true) {
+    emu_callback();               // Emulator callback
     hw_reset_handler();           // handle hard reset requests
     state_callback();             // manage state
     command_callback();           // process next command
index 0615e34d39da8e20fc63f7a90aef0d391685c127..284b5422942fb2aad726bcca6881dfd562369cc1 100644 (file)
@@ -52,7 +52,7 @@ STAT_MSG(MOTOR_NOT_PREPPED,     "Motor move not prepped")
 STAT_MSG(MOTOR_NOT_READY,       "Motor not ready for move")
 STAT_MSG(STEPPER_NULL_MOVE,     "Null move in stepper driver")
 STAT_MSG(STEPPER_NOT_READY,     "Stepper driver not ready for move")
-STAT_MSG(SHORT_SEG_TIME,        "Short segment time")
+STAT_MSG(LONG_SEG_TIME,         "Long segment time")
 STAT_MSG(MODBUS_BUF_LENGTH,     "Modbus invalid buffer length")
 STAT_MSG(INVALID_QCMD,          "Invalid command in queue")
 STAT_MSG(Q_OVERRUN,             "Command queue overrun")
index 29ee72a51bf5b1d77f0cbc0997b78775d8d4d3aa..6a97bfb2d5cab4521dac08097051a805adf2c00c 100644 (file)
@@ -232,6 +232,12 @@ stat_t motor_rtc_callback() { // called by controller
 }
 
 
+void motor_emulate_steps(int motor) {
+  motor_t *m = &motors[motor];
+  m->dma->TRFCNT = 0xffff - abs(m->commanded - m->encoder);
+}
+
+
 void motor_end_move(int motor) {
   motor_t *m = &motors[motor];
 
index 6e6a9e75675148f21e6b18dace698a42356a3630..9d7f25f03dc82e3ff7a866b9203932a7e4d41d8c 100644 (file)
 
 #pragma once
 
-#ifdef __AVR__
-
 #include <avr/pgmspace.h>
-#define PRPSTR "S"
-
-#else // __AVR__
 
+#ifdef __AVR__
+#define PRPSTR "S"
+#else
 #define PRPSTR "s"
-#define PROGMEM
-#define PGM_P const char *
-#define PSTR(X) X
-#define vfprintf_P vfprintf
-#define printf_P printf
-#define puts_P puts
-#define sprintf_P sprintf
-#define strcmp_P strcmp
-#define pgm_read_ptr(x) *(x)
-#define pgm_read_word(x) *(x)
-#define pgm_read_byte(x) *(x)
-
-#endif // __AVR__
+#endif
index 56fc78d100e2f9a2c02c16fb879377a1984dd35b..6d6cd8b1a01f0fc923b44877833add6fe4a812fb 100644 (file)
@@ -37,7 +37,6 @@ enum {PORT_A = 1, PORT_B, PORT_C, PORT_D, PORT_E, PORT_F};
 
 #define PIN_ID(PORT, PIN) (PORT << 3 | (PIN & 7))
 
-#ifdef __AVR__
 #include <avr/io.h>
 
 extern PORT_t *pin_ports[];
@@ -56,5 +55,3 @@ extern PORT_t *pin_ports[];
 
 #define PIN_EVSYS_CHMUX(PIN) \
   (EVSYS_CHMUX_PORTA_PIN0_gc + (8 * PORT_INDEX(PIN)) + PIN_INDEX(PIN))
-
-#endif // __AVR__
index ac37a1bfb966704b10d401e659d4d3c02af78bdb..17dba80433e36de3ec83756fe3309a6d9265de31 100644 (file)
@@ -89,10 +89,12 @@ ISR(SERIAL_RXC_vect) {
 }
 
 
+#ifdef __AVR__
 static int _usart_putchar(char c, FILE *f) {
   usart_putc(c);
   return 0;
 }
+#endif // __AVR__
 
 
 static void _set_baud(USART_t *port, uint16_t bsel, uint8_t bscale) {
@@ -194,6 +196,7 @@ void usart_init() {
 
   PMIC.CTRL |= PMIC_HILVLEN_bm; // Interrupt level on
 
+#ifdef __AVR__
   // Connect IO
   static FILE _stdout;
   memset(&_stdout, 0, sizeof(FILE));
@@ -202,6 +205,7 @@ void usart_init() {
 
   stdout = &_stdout;
   stderr = &_stdout;
+#endif // __AVR__
 
   // Enable Rx
   _set_rxc_interrupt(true);
index e6fe69981cef9a9a1e2ad61fb7e08fbfc55c79fd..244ae08e07bd40937632eac7759f4f3ef485881b 100644 (file)
@@ -230,7 +230,7 @@ static char *_resolve_name(const char *_name) {
 
 
 static int _index(char c, const char *s) {
-  char *index = strchr(s, c);
+  const char *index = strchr(s, c);
   return index ? index - s : -1;
 }
 
old mode 100755 (executable)
new mode 100644 (file)
index 2f278b0..2006faf
@@ -1,5 +1,32 @@
 #!/usr/bin/env python3
 
+################################################################################
+#                                                                              #
+#                 This file is part of the Buildbotics firmware.               #
+#                                                                              #
+#                   Copyright (c) 2015 - 2018, Buildbotics LLC                 #
+#                              All rights reserved.                            #
+#                                                                              #
+#      This file ("the software") is free software: you can redistribute it    #
+#      and/or modify it under the terms of the GNU General Public License,     #
+#       version 2 as published by the Free Software Foundation. You should     #
+#       have received a copy of the GNU General Public License, version 2      #
+#      along with the software. If not, see <http://www.gnu.org/licenses/>.    #
+#                                                                              #
+#      The software 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      #
+#                Lesser General Public License for more details.               #
+#                                                                              #
+#        You should have received a copy of the GNU Lesser General Public      #
+#                 License along with the software.  If not, see                #
+#                        <http://www.gnu.org/licenses/>.                       #
+#                                                                              #
+#                 For information regarding this software email:               #
+#                   "Joseph Coffland" <joseph@buildbotics.com>                 #
+#                                                                              #
+################################################################################
+
 import sys, serial, argparse
 import numpy as np
 import math
index 150a5655b8196badd2c1f0dca120e884efb82e95..0bbedea68a10082caa82ca8b52da37aff717819b 100644 (file)
@@ -1,2 +1 @@
-firmware-test
-jogsim
+bbemu
index 793c3e6b384a2d2f977963299d8065ea700f3672..7f982b219cfe67df87415f797938365ee9df806c 100644 (file)
@@ -1,42 +1,38 @@
-TARGETS = firmware-test jogsim
+TARGET = bbemu
 
-FIRMWARE_TEST_SRC = status.c util.c axis.c report.c type.c exec.c base64.c \
-  command.c commands.c vars.c state.c line.c seek.c SCurve.cpp
-FIRMWARE_TEST_SRC := $(patsubst %,../src/%,$(FIRMWARE_TEST_SRC))
-FIRMWARE_TEST_SRC += firmware-test.c hal.c
+SRC:=$(wildcard ../src/*.c) $(wildcard ../src/*.cpp)
+OBJ:=$(patsubst %.cpp,%.o,$(patsubst %.c,%.o,$(SRC)))
+OBJ:=$(patsubst ../src/%,build/%,$(OBJ))
+SRC+=src/emu.c
+OBJ+=build/emu.o
 
-JOGSIM_SRC = ../src/SCurve.cpp jogsim.cpp
+CFLAGS = -I../src -Isrc -Wall -Werror -DDEBUG -g -std=gnu++98
+CFLAGS += -MD -MP -MT $@ -MF build/$(@F).d
+CFLAGS += -DF_CPU=32000000 -Wno-class-memaccess -pthread
+LDFLAGS = -lm -pthread
 
-CFLAGS = -I../src -Wall -Werror -DDEBUG -g -std=gnu++98
-CFLAGS += -MD -MP -MT $@ -MF .dep/$(@F).d
-CFLAGS += -DF_CPU=320000000
-LDFLAGS = -lm
+all: $(TARGET)
 
-all: $(TARGETS)
+$(TARGET): $(OBJ)
+       g++ -o $@ $(OBJ) $(LDFLAGS)
 
-firmware-test: $(FIRMWARE_TEST_SRC)
-       g++ -o $@ $(FIRMWARE_TEST_SRC) $(CFLAGS) $(LDFLAGS)
+build/%.o: ../src/%.c
+       g++ -c -o $@ $(CFLAGS) $<
 
-jogsim: $(JOGSIM_SRC)
-       g++ -o $@ $(JOGSIM_SRC) $(CFLAGS) $(LDFLAGS)
+build/%.o: src/%.c
+       g++ -c -o $@ $(CFLAGS) $<
 
-%.csv: %.gc firmware-test
-       ./firmware-test < $< | grep -E '^-?[0-9.]+,'
-
-%-test: %.gc firmware-test
-       ./firmware-test < $<
-
-%-plot: %.gc firmware-test
-       ./firmware-test < $< | grep -E '^-?[0-9.]+,' | ./plot.py
+build/%.o: ../src/%.cpp
+       g++ -c -o $@ $(CFLAGS) $<
 
 # Clean
 tidy:
-       rm -f $(shell find -name \*~ -o -name \#\*) .dep
+       rm -f $(shell find -name \*~ -o -name \#\*)
 
 clean: tidy
-       rm -rf $(TESTS)
+       rm -rf $(TARGET) build
 
 .PHONY: tidy clean all
 
 # Dependencies
--include $(shell mkdir -p .dep) $(wildcard .dep/*)
+-include $(shell mkdir -p build) $(wildcard build/*.d)
diff --git a/src/avr/test/arc.gc b/src/avr/test/arc.gc
deleted file mode 100644 (file)
index 72b612f..0000000
+++ /dev/null
@@ -1,10 +0,0 @@
-$resume
-
-$0vm=10000
-$1vm=10000
-$2vm=10000
-$0jm=50
-$1jm=50
-$2jm=50
-
-G3 I2 J2 F10000
diff --git a/src/avr/test/firmware-test.c b/src/avr/test/firmware-test.c
deleted file mode 100644 (file)
index 5e5b3a0..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-/******************************************************************************\
-
-                 This file is part of the Buildbotics firmware.
-
-                   Copyright (c) 2015 - 2018, Buildbotics LLC
-                              All rights reserved.
-
-      This file ("the software") is free software: you can redistribute it
-      and/or modify it under the terms of the GNU General Public License,
-       version 2 as published by the Free Software Foundation. You should
-       have received a copy of the GNU General Public License, version 2
-      along with the software. If not, see <http://www.gnu.org/licenses/>.
-
-      The software 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
-                Lesser General Public License for more details.
-
-        You should have received a copy of the GNU Lesser General Public
-                 License along with the software.  If not, see
-                        <http://www.gnu.org/licenses/>.
-
-                 For information regarding this software email:
-                   "Joseph Coffland" <joseph@buildbotics.com>
-
-\******************************************************************************/
-
-#include "axis.h"
-#include "command.h"
-#include "exec.h"
-#include "state.h"
-#include "vars.h"
-#include "report.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-
-
-int main() {
-  axis_map_motors();
-  exec_init();                    // motion exec
-  vars_init();                    // configuration variables
-  command_init();
-
-  stat_t status = STAT_OK;
-
-  while (true) {
-    bool reading = !feof(stdin);
-
-    report_callback();
-
-    if (reading) {
-      state_callback();
-      if (command_callback()) continue;
-    }
-
-    status = exec_next();
-    printf("EXEC: %s\n", status_to_pgmstr(status));
-
-    switch (status) {
-    case STAT_NOP: break;       // No command executed
-    case STAT_AGAIN: continue;  // No command executed, try again
-    case STAT_OK: continue;     // Move executed
-
-    default:
-      printf("ERROR: %s\n", status_to_pgmstr(status));
-    }
-
-    if (!reading) break;
-  }
-
-  printf("STATE: %s\n", state_get_pgmstr(state_get()));
-
-  return 0;
-}
diff --git a/src/avr/test/hal.c b/src/avr/test/hal.c
deleted file mode 100644 (file)
index baeca5d..0000000
+++ /dev/null
@@ -1,178 +0,0 @@
-/******************************************************************************\
-
-                 This file is part of the Buildbotics firmware.
-
-                   Copyright (c) 2015 - 2018, Buildbotics LLC
-                              All rights reserved.
-
-      This file ("the software") is free software: you can redistribute it
-      and/or modify it under the terms of the GNU General Public License,
-       version 2 as published by the Free Software Foundation. You should
-       have received a copy of the GNU General Public License, version 2
-      along with the software. If not, see <http://www.gnu.org/licenses/>.
-
-      The software 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
-                Lesser General Public License for more details.
-
-        You should have received a copy of the GNU Lesser General Public
-                 License along with the software.  If not, see
-                        <http://www.gnu.org/licenses/>.
-
-                 For information regarding this software email:
-                   "Joseph Coffland" <joseph@buildbotics.com>
-
-\******************************************************************************/
-
-#include "status.h"
-#include "spindle.h"
-#include "i2c.h"
-#include "type.h"
-#include "switch.h"
-#include "cpp_magic.h"
-
-#include <stdint.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <math.h>
-#include <ctype.h>
-#include <string.h>
-
-
-typedef uint8_t flags_t;
-typedef const char *string;
-typedef const char *pstring;
-
-
-#define VAR(NAME, CODE, TYPE, INDEX, SET, ...)                          \
-  TYPE get_##NAME(IF(INDEX)(int index)) __attribute__((weak));          \
-  TYPE get_##NAME(IF(INDEX)(int index)) {                               \
-    DEBUG_CALL();                                                       \
-    return 0;                                                           \
-  }                                                                     \
-  IF(SET)                                                               \
-  (void set_##NAME(IF(INDEX)(int index,) TYPE value) __attribute__((weak)); \
-   void set_##NAME(IF(INDEX)(int index,) TYPE value) {                  \
-     DEBUG_CALL();                                                      \
-   })
-
-#include "vars.def"
-#undef VAR
-
-
-float square(float x) {return x * x;}
-void i2c_set_read_callback(i2c_read_cb_t cb) {}
-void print_status_flags(uint16_t flags) {DEBUG_CALL();}
-
-
-bool estop = false;
-
-
-void estop_trigger(stat_t reason) {
-  DEBUG_CALL("%s", status_to_pgmstr(reason));
-  estop = true;
-  abort();
-}
-
-
-void estop_clear() {DEBUG_CALL(); estop = false;}
-bool estop_triggered() {return estop;}
-
-
-void hw_request_hard_reset() {DEBUG_CALL(); exit(0);}
-
-
-bool usart_tx_fill() {return 0;}
-
-
-char *usart_readline() {
-  static char *cmd = 0;
-
-  if (cmd) {
-    free(cmd);
-    cmd = 0;
-  }
-
-  size_t n = 0;
-  if (getline(&cmd, &n, stdin) == -1) {
-    free(cmd);
-    return 0;
-  }
-
-  n = strlen(cmd);
-  while (n && isspace(cmd[n - 1])) cmd[--n] = 0;
-
-  return cmd;
-}
-
-
-void spindle_set_speed(float speed) {DEBUG_CALL("%f", speed);}
-void spindle_stop() {}
-
-
-void st_set_position(int32_t position[AXES]) {
-  DEBUG_CALL("%d, %d, %d, %d",
-             position[0], position[1], position[2], position[3]);
-}
-
-
-bool switch_is_active(switch_id_t sw) {DEBUG_CALL("%d", sw); return false;}
-bool switch_is_enabled(switch_id_t sw) {DEBUG_CALL("%d", sw); return false;}
-void switch_set_callback(switch_id_t sw, switch_callback_t cb) {}
-
-
-static uint32_t ticks = 0;
-uint32_t rtc_get_time() {return ticks;}
-bool rtc_expired(uint32_t t) {return true;}
-
-
-bool motor_is_enabled(int motor) {return true;}
-int motor_get_axis(int motor) {return motor;}
-bool motor_get_homed(int motor) {return false;}
-float motor_get_soft_limit(int motor, bool min) {return 0;}
-void motor_set_position(int motor, float position) {}
-
-#define MICROSTEPS 32
-#define TRAVEL_REV 5
-#define STEP_ANGLE 1.8
-
-
-int32_t motor_get_encoder(int motor) {DEBUG_CALL("%d", motor); return 0;}
-void motor_end_move(int motor) {DEBUG_CALL("%d", motor);}
-int32_t motor_get_error(int motor) {return 0;}
-
-
-bool st_is_busy() {return false;}
-
-
-stat_t st_prep_line(float time, const float target[]) {
-  ASSERT(isfinite(time));
-
-  const float maxTarget = 1000;
-  for (int i = 0; i < 3; i++) {
-    ASSERT(isfinite(target[i]));
-    ASSERT(-maxTarget < target[i] && target[i] < maxTarget);
-  }
-
-  printf("%0.10f, %0.10f, %0.10f, %0.10f\n",
-         time, target[0], target[1], target[2]);
-
-  return STAT_OK;
-}
-
-
-void st_prep_dwell(float seconds) {DEBUG_CALL("%f", seconds);}
-
-
-void outputs_stop() {}
-void jog_stop() {}
-
-
-// Command callbacks
-stat_t command_estop(char *cmd) {DEBUG_CALL(); return STAT_OK;}
-stat_t command_clear(char *cmd) {DEBUG_CALL(); return STAT_OK;}
-stat_t command_jog(char *cmd) {DEBUG_CALL(); return STAT_OK;}
-stat_t command_input(char *cmd) {DEBUG_CALL(); return STAT_OK;}
-unsigned command_input_size() {return 0;}
-void command_input_exec(void *data) {}
diff --git a/src/avr/test/jogsim.cpp b/src/avr/test/jogsim.cpp
deleted file mode 100644 (file)
index a01af1b..0000000
+++ /dev/null
@@ -1,135 +0,0 @@
-/******************************************************************************\
-
-    CAMotics is an Open-Source simulation and CAM software.
-    Copyright (C) 2011-2017 Joseph Coffland <joseph@cauldrondevelopment.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 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.
-
-    You should have received a copy of the GNU General Public License
-    along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-\******************************************************************************/
-
-#include "SCurve.h"
-
-#include <iostream>
-#include <vector>
-
-#include <sys/time.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <fcntl.h>
-#include <string.h>
-#include <math.h>
-
-using namespace std;
-
-
-ostream &operator<<(ostream &stream, const float v[4]) {
-  return
-    stream << '(' << v[0] << ',' << v[1] << ',' << v[2] << ',' << v[3] << ')';
-}
-
-
-int main(int argc, char *argv[]) {
-  if (argc != 6) {
-    cout << "Usage: " << argv[0] << " <min soft limit> <max soft limit> "
-         << "<max velocity> <max acceleration> <max jerk>" << endl;
-    return 1;
-  }
-
-  float min = atof(argv[1]);
-  float max = atof(argv[2]);
-  float maxVel = atof(argv[3]);
-  float maxAccel = atof(argv[4]);
-  float maxJerk = atof(argv[5]);
-
-  vector<SCurve> scurves;
-  for (unsigned axis = 0; axis < 4; axis++)
-    scurves.push_back(SCurve(maxVel, maxAccel, maxJerk));
-
-  float p[4];
-  float targetV[4];
-  float lastP[4];
-  const float deltaT = 0.005 / 60;
-  const float coastV = 10; // mm/min
-
-  const size_t maxLen = 1024;
-  char *line = new char[maxLen];
-
-  // Non-blocking input
-  fcntl(0, F_SETFL, fcntl(0, F_GETFL) | O_NONBLOCK);
-
-  while (true) {
-    while (true) {
-      struct timeval tv = {0, 0};
-      fd_set fds;
-
-      FD_ZERO(&fds);
-      FD_SET(0, &fds);
-
-      int ret = select(1, &fds, 0, 0, &tv);
-      if (ret == -1) return 0;
-      if (!ret) break;
-
-      ssize_t len = getline(&line, (size_t *)&maxLen, stdin);
-      if (len < 0) break;
-
-      const char *delims = ", \t\n\r";
-      char *s = line;
-
-      for (unsigned i = 0; i < 4; i++) {
-        char *token = strtok(s, delims);
-        if (!token) break;
-        targetV[i] = atof(token) * maxVel;
-        s = 0;
-      }
-    }
-
-    float v[4], a[4], j[4], d[4];
-    bool changed = false;
-
-    for (unsigned axis = 0; axis < 4; axis++) {
-      float vel = scurves[axis].getVelocity();
-      float targetVel = targetV[axis];
-
-      if (coastV < fabs(targetVel)) {
-        float dist = scurves[axis].getStoppingDist() * 1.01;
-
-        if (vel < 0 && p[axis] - dist <= min) targetVel = -coastV;
-        if (0 < vel && max <= p[axis] + dist) targetVel = coastV;
-      }
-
-      v[axis] = scurves[axis].next(deltaT, targetVel);
-      a[axis] = scurves[axis].getAcceleration();
-      j[axis] = scurves[axis].getJerk();
-      d[axis] = scurves[axis].getStoppingDist();
-
-      float deltaP = v[axis] * deltaT;
-      if (0 < deltaP && max < p[axis] + deltaP) p[axis] = max;
-      else if (deltaP < 0 && p[axis] + deltaP < min) p[axis] = min;
-      else p[axis] += deltaP;
-
-      if (lastP[axis] != p[axis]) {
-        changed = true;
-        lastP[axis] = p[axis];
-      }
-    }
-
-    if (changed)
-      cout << p << ' ' << targetV << ' ' << v << ' ' << a << ' ' << j << ' '
-           << d << endl;
-
-    usleep(5000); // 5ms
-  }
-}
diff --git a/src/avr/test/jogtest.py b/src/avr/test/jogtest.py
deleted file mode 100755 (executable)
index 709156b..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-#!/usr/bin/env python3
-
-import sys
-import tornado.ioloop
-
-from inevent import InEvent, JogHandler
-from inevent.Constants import *
-
-
-class Handler(JogHandler):
-  def changed(self):
-    scale = 1.0
-    if self.speed == 1: scale = 1.0 / 128.0
-    if self.speed == 2: scale = 1.0 / 32.0
-    if self.speed == 3: scale = 1.0 / 4.0
-
-    print(', '.join(list(map(lambda x: '%.3f' % (x * scale), self.axes))))
-    sys.stdout.flush()
-
-
-if __name__ == "__main__":
-  # Load config
-  config = {
-      "Logitech Logitech RumblePad 2 USB": {
-          "deadband": 0.1,
-          "axes":     [ABS_X, ABS_Y, ABS_RZ, ABS_Z],
-          "dir":      [1, -1, -1, 1],
-          "arrows":   [ABS_HAT0X, ABS_HAT0Y],
-          "speed":    [0x120, 0x121, 0x122, 0x123],
-          "lock":     [0x124, 0x125],
-          },
-
-      "default": {
-          "deadband": 0.1,
-          "axes":     [ABS_X, ABS_Y, ABS_RY, ABS_RX],
-          "dir":      [1, -1, -1, 1],
-          "arrows":   [ABS_HAT0X, ABS_HAT0Y],
-          "speed":    [0x133, 0x130, 0x131, 0x134],
-          "lock":     [0x136, 0x137],
-          }
-      }
-
-  # Create ioloop
-  ioloop = tornado.ioloop.IOLoop.current()
-
-  # Listen for input events
-  handler = Handler(config)
-  events = InEvent(ioloop, handler, types = "js kbd".split())
-
-  ioloop.start()
diff --git a/src/avr/test/line.gc b/src/avr/test/line.gc
deleted file mode 100644 (file)
index 20695cc..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-$resume
-
-$0vm=10000
-$1vm=10000
-$2vm=10000
-$0jm=50
-$1jm=50
-$2jm=50
-
-G0 X500Y500
-G0 X0Y0
-G0 X-500Y0
-G0 X-500Y-500
-
-G0 Z-100
-G0 Z0
diff --git a/src/avr/test/plot.py b/src/avr/test/plot.py
deleted file mode 100644 (file)
index 4db0aa2..0000000
+++ /dev/null
@@ -1,117 +0,0 @@
-#!/usr/bin/env python3
-
-################################################################################
-#                                                                              #
-#                This file is part of the Buildbotics firmware.                #
-#                                                                              #
-#                  Copyright (c) 2015 - 2018, Buildbotics LLC                  #
-#                             All rights reserved.                             #
-#                                                                              #
-#     This file ("the software") is free software: you can redistribute it     #
-#     and/or modify it under the terms of the GNU General Public License,      #
-#      version 2 as published by the Free Software Foundation. You should      #
-#      have received a copy of the GNU General Public License, version 2       #
-#     along with the software. If not, see <http://www.gnu.org/licenses/>.     #
-#                                                                              #
-#     The software 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       #
-#               Lesser General Public License for more details.                #
-#                                                                              #
-#       You should have received a copy of the GNU Lesser General Public       #
-#                License along with the software.  If not, see                 #
-#                       <http://www.gnu.org/licenses/>.                        #
-#                                                                              #
-#                For information regarding this software email:                #
-#                  "Joseph Coffland" <joseph@buildbotics.com>                  #
-#                                                                              #
-################################################################################
-
-import sys
-import csv
-import matplotlib.pyplot as plt
-import numpy as np
-import math
-
-
-def compute_velocity(rows):
-    p = [0, 0, 0]
-
-    for row in rows:
-        t = float(row[0])
-        d = 0.0
-
-        for i in range(3):
-            x = float(row[i + 1]) - p[i]
-            d += x * x
-            p[i] = float(row[i + 1])
-
-        d = math.sqrt(d)
-
-        yield d / t
-
-
-time_step = 0.005
-
-data = list(csv.reader(sys.stdin))
-
-velocity = list(compute_velocity(data))
-acceleration = np.diff(velocity)
-jerk = np.diff(acceleration)
-
-t = np.cumsum([float(row[0]) for row in data])
-x = [float(row[1]) for row in data]
-y = [float(row[2]) for row in data]
-z = [float(row[3]) for row in data]
-
-rows = 3
-row = 1
-if np.sum(x): rows += 1
-if np.sum(y): rows += 1
-if np.sum(z): rows += 1
-
-def next_subplot():
-    global row
-    plt.subplot(rows * 100 + 10 + row)
-    row += 1
-
-if np.sum(x):
-    next_subplot()
-    plt.title('X')
-    plt.plot(t, x, 'r')
-    plt.ylabel(r'$mm$')
-
-if np.sum(y):
-    next_subplot()
-    plt.title('X')
-    plt.title('Y')
-    plt.plot(t, [row[2] for row in data], 'g')
-    plt.ylabel(r'$mm$')
-
-if np.sum(z):
-    next_subplot()
-    plt.title('Z')
-    plt.plot(t, [row[3] for row in data], 'b')
-    plt.ylabel(r'$mm$')
-
-next_subplot()
-plt.title('Velocity')
-plt.plot(t, velocity, 'g')
-plt.ylabel(r'$\frac{mm}{min}$')
-
-next_subplot()
-plt.title('Acceleration')
-plt.plot(t[1:], acceleration, 'b')
-plt.ylabel(r'$\frac{mm}{min^2}$')
-
-next_subplot()
-plt.title('Jerk')
-plt.plot(t[2:], jerk, 'r')
-plt.ylabel(r'$\frac{mm}{min^3}$')
-plt.xlabel('Seconds')
-
-plt.tight_layout()
-plt.subplots_adjust(hspace = 0.5)
-mng = plt.get_current_fig_manager()
-mng.resize(*mng.window.maxsize())
-plt.show()
diff --git a/src/avr/test/short.gc b/src/avr/test/short.gc
deleted file mode 100644 (file)
index 1ba1685..0000000
+++ /dev/null
@@ -1,59 +0,0 @@
-$resume
-
-$0vm=10000
-$1vm=10000
-$2vm=10000
-$0jm=50
-$1jm=50
-$2jm=50
-
-G0 X0.0
-G0 X0.1
-G0 X0.2
-G0 X0.3
-G0 X0.4
-G0 X0.5
-G0 X0.6
-G0 X0.7
-G0 X0.8
-G0 X0.9
-G0 X1.0
-G0 X1.1
-G0 X1.2
-G0 X1.3
-G0 X1.4
-G0 X1.5
-G0 X1.6
-G0 X1.7
-G0 X1.8
-G0 X1.9
-G0 X2.0
-G0 X2.1
-G0 X2.2
-G0 X2.3
-G0 X2.4
-G0 X2.5
-G0 X2.6
-G0 X2.7
-G0 X2.8
-G0 X2.9
-G0 X3.0
-G0 X3.1
-G0 X3.2
-G0 X3.3
-G0 X3.4
-G0 X3.5
-G0 X3.6
-G0 X3.7
-G0 X3.8
-G0 X3.9
-G0 X4.0
-G0 X4.1
-G0 X4.2
-G0 X4.3
-G0 X4.4
-G0 X4.5
-G0 X4.6
-G0 X4.7
-G0 X4.8
-G0 X4.9
diff --git a/src/avr/test/src/avr/eeprom.h b/src/avr/test/src/avr/eeprom.h
new file mode 100644 (file)
index 0000000..bafb8b0
--- /dev/null
@@ -0,0 +1,34 @@
+/******************************************************************************\
+
+                  This file is part of the Buildbotics firmware.
+
+                    Copyright (c) 2015 - 2018, Buildbotics LLC
+                               All rights reserved.
+
+       This file ("the software") is free software: you can redistribute it
+       and/or modify it under the terms of the GNU General Public License,
+        version 2 as published by the Free Software Foundation. You should
+        have received a copy of the GNU General Public License, version 2
+       along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+       The software 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
+                 Lesser General Public License for more details.
+
+         You should have received a copy of the GNU Lesser General Public
+                  License along with the software.  If not, see
+                         <http://www.gnu.org/licenses/>.
+
+                  For information regarding this software email:
+                    "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#pragma once
+
+#define EEMEM
+
+#define eeprom_update_word(PTR, VAL) *(PTR) = (VAL)
+#define eeprom_read_word(PTR) *(PTR)
+#define eeprom_is_ready() true
diff --git a/src/avr/test/src/avr/interrupt.h b/src/avr/test/src/avr/interrupt.h
new file mode 100644 (file)
index 0000000..10fd67b
--- /dev/null
@@ -0,0 +1,35 @@
+/******************************************************************************\
+
+                  This file is part of the Buildbotics firmware.
+
+                    Copyright (c) 2015 - 2018, Buildbotics LLC
+                               All rights reserved.
+
+       This file ("the software") is free software: you can redistribute it
+       and/or modify it under the terms of the GNU General Public License,
+        version 2 as published by the Free Software Foundation. You should
+        have received a copy of the GNU General Public License, version 2
+       along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+       The software 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
+                 Lesser General Public License for more details.
+
+         You should have received a copy of the GNU Lesser General Public
+                  License along with the software.  If not, see
+                         <http://www.gnu.org/licenses/>.
+
+                  For information regarding this software email:
+                    "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#pragma once
+
+#include "io.h"
+
+void cli();
+void sei();
+
+#define ISR(X) void __##X()
diff --git a/src/avr/test/src/avr/io.h b/src/avr/test/src/avr/io.h
new file mode 100644 (file)
index 0000000..3d0e145
--- /dev/null
@@ -0,0 +1,7718 @@
+/******************************************************************************\
+
+                  This file is part of the Buildbotics firmware.
+
+                    Copyright (c) 2015 - 2018, Buildbotics LLC
+                               All rights reserved.
+
+       This file ("the software") is free software: you can redistribute it
+       and/or modify it under the terms of the GNU General Public License,
+        version 2 as published by the Free Software Foundation. You should
+        have received a copy of the GNU General Public License, version 2
+       along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+       The software 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
+                 Lesser General Public License for more details.
+
+         You should have received a copy of the GNU Lesser General Public
+                  License along with the software.  If not, see
+                         <http://www.gnu.org/licenses/>.
+
+                  For information regarding this software email:
+                    "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+/*****************************************************************************
+ *
+ * Copyright (C) 2015 Atmel Corporation
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in
+ *   the documentation and/or other materials provided with the
+ *   distribution.
+ *
+ * * Neither the name of the copyright holders nor the names of
+ *   contributors may be used to endorse or promote products derived
+ *   from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ ****************************************************************************/
+
+#ifndef _AVR_ATXMEGA192A3U_H_INCLUDED
+#define _AVR_ATXMEGA192A3U_H_INCLUDED
+
+#include <stdint.h>
+
+#define _SFR_MEM8(mem_addr) (*(volatile uint8_t *)(io_mem + (mem_addr)))
+extern volatile uint8_t io_mem[4096];
+
+/* Ungrouped common registers */
+#define GPIOR0  _SFR_MEM8(0x0000)  /* General Purpose IO Register 0 */
+#define GPIOR1  _SFR_MEM8(0x0001)  /* General Purpose IO Register 1 */
+#define GPIOR2  _SFR_MEM8(0x0002)  /* General Purpose IO Register 2 */
+#define GPIOR3  _SFR_MEM8(0x0003)  /* General Purpose IO Register 3 */
+#define GPIOR4  _SFR_MEM8(0x0004)  /* General Purpose IO Register 4 */
+#define GPIOR5  _SFR_MEM8(0x0005)  /* General Purpose IO Register 5 */
+#define GPIOR6  _SFR_MEM8(0x0006)  /* General Purpose IO Register 6 */
+#define GPIOR7  _SFR_MEM8(0x0007)  /* General Purpose IO Register 7 */
+#define GPIOR8  _SFR_MEM8(0x0008)  /* General Purpose IO Register 8 */
+#define GPIOR9  _SFR_MEM8(0x0009)  /* General Purpose IO Register 9 */
+#define GPIORA  _SFR_MEM8(0x000A)  /* General Purpose IO Register 10 */
+#define GPIORB  _SFR_MEM8(0x000B)  /* General Purpose IO Register 11 */
+#define GPIORC  _SFR_MEM8(0x000C)  /* General Purpose IO Register 12 */
+#define GPIORD  _SFR_MEM8(0x000D)  /* General Purpose IO Register 13 */
+#define GPIORE  _SFR_MEM8(0x000E)  /* General Purpose IO Register 14 */
+#define GPIORF  _SFR_MEM8(0x000F)  /* General Purpose IO Register 15 */
+
+/* Deprecated */
+#define GPIO0  _SFR_MEM8(0x0000)  /* General Purpose IO Register 0 */
+#define GPIO1  _SFR_MEM8(0x0001)  /* General Purpose IO Register 1 */
+#define GPIO2  _SFR_MEM8(0x0002)  /* General Purpose IO Register 2 */
+#define GPIO3  _SFR_MEM8(0x0003)  /* General Purpose IO Register 3 */
+#define GPIO4  _SFR_MEM8(0x0004)  /* General Purpose IO Register 4 */
+#define GPIO5  _SFR_MEM8(0x0005)  /* General Purpose IO Register 5 */
+#define GPIO6  _SFR_MEM8(0x0006)  /* General Purpose IO Register 6 */
+#define GPIO7  _SFR_MEM8(0x0007)  /* General Purpose IO Register 7 */
+#define GPIO8  _SFR_MEM8(0x0008)  /* General Purpose IO Register 8 */
+#define GPIO9  _SFR_MEM8(0x0009)  /* General Purpose IO Register 9 */
+#define GPIOA  _SFR_MEM8(0x000A)  /* General Purpose IO Register 10 */
+#define GPIOB  _SFR_MEM8(0x000B)  /* General Purpose IO Register 11 */
+#define GPIOC  _SFR_MEM8(0x000C)  /* General Purpose IO Register 12 */
+#define GPIOD  _SFR_MEM8(0x000D)  /* General Purpose IO Register 13 */
+#define GPIOE  _SFR_MEM8(0x000E)  /* General Purpose IO Register 14 */
+#define GPIOF  _SFR_MEM8(0x000F)  /* General Purpose IO Register 15 */
+
+#define CCP  _SFR_MEM8(0x0034)  /* Configuration Change Protection */
+#define RAMPD  _SFR_MEM8(0x0038)  /* Ramp D */
+#define RAMPX  _SFR_MEM8(0x0039)  /* Ramp X */
+#define RAMPY  _SFR_MEM8(0x003A)  /* Ramp Y */
+#define RAMPZ  _SFR_MEM8(0x003B)  /* Ramp Z */
+#define EIND  _SFR_MEM8(0x003C)  /* Extended Indirect Jump */
+#define SPL  _SFR_MEM8(0x003D)  /* Stack Pointer Low */
+#define SPH  _SFR_MEM8(0x003E)  /* Stack Pointer High */
+#define SREG  _SFR_MEM8(0x003F)  /* Status Register */
+
+/* C Language Only */
+#if !defined (__ASSEMBLER__)
+
+#include <stdint.h>
+
+typedef volatile uint8_t register8_t;
+typedef volatile uint16_t register16_t;
+typedef volatile uint32_t register32_t;
+
+
+#ifdef _WORDREGISTER
+#undef _WORDREGISTER
+#endif
+#define _WORDREGISTER(regname)   \
+    __extension__ union \
+    { \
+        register16_t regname; \
+        struct \
+        { \
+            register8_t regname ## L; \
+            register8_t regname ## H; \
+        }; \
+    }
+
+#ifdef _DWORDREGISTER
+#undef _DWORDREGISTER
+#endif
+#define _DWORDREGISTER(regname)  \
+    __extension__ union \
+    { \
+        register32_t regname; \
+        struct \
+        { \
+            register8_t regname ## 0; \
+            register8_t regname ## 1; \
+            register8_t regname ## 2; \
+            register8_t regname ## 3; \
+        }; \
+    }
+
+
+/*
+==========================================================================
+IO Module Structures
+==========================================================================
+*/
+
+
+/*
+--------------------------------------------------------------------------
+VPORT - Virtual Ports
+--------------------------------------------------------------------------
+*/
+
+/* Virtual Port */
+typedef struct VPORT_struct
+{
+    register8_t DIR;  /* I/O Port Data Direction */
+    register8_t OUT;  /* I/O Port Output */
+    register8_t IN;  /* I/O Port Input */
+    register8_t INTFLAGS;  /* Interrupt Flag Register */
+} VPORT_t;
+
+
+/*
+--------------------------------------------------------------------------
+XOCD - On-Chip Debug System
+--------------------------------------------------------------------------
+*/
+
+/* On-Chip Debug System */
+typedef struct OCD_struct
+{
+    register8_t OCDR0;  /* OCD Register 0 */
+    register8_t OCDR1;  /* OCD Register 1 */
+} OCD_t;
+
+
+/*
+--------------------------------------------------------------------------
+CPU - CPU
+--------------------------------------------------------------------------
+*/
+
+/* CCP signatures */
+typedef enum CCP_enum
+{
+    CCP_SPM_gc = (0x9D<<0),  /* SPM Instruction Protection */
+    CCP_IOREG_gc = (0xD8<<0),  /* IO Register Protection */
+} CCP_t;
+
+
+/*
+--------------------------------------------------------------------------
+CLK - Clock System
+--------------------------------------------------------------------------
+*/
+
+/* Clock System */
+typedef struct CLK_struct
+{
+    register8_t CTRL;  /* Control Register */
+    register8_t PSCTRL;  /* Prescaler Control Register */
+    register8_t LOCK;  /* Lock register */
+    register8_t RTCCTRL;  /* RTC Control Register */
+    register8_t USBCTRL;  /* USB Control Register */
+} CLK_t;
+
+
+/* Power Reduction */
+typedef struct PR_struct
+{
+    register8_t PRGEN;  /* General Power Reduction */
+    register8_t PRPA;  /* Power Reduction Port A */
+    register8_t PRPB;  /* Power Reduction Port B */
+    register8_t PRPC;  /* Power Reduction Port C */
+    register8_t PRPD;  /* Power Reduction Port D */
+    register8_t PRPE;  /* Power Reduction Port E */
+    register8_t PRPF;  /* Power Reduction Port F */
+} PR_t;
+
+/* System Clock Selection */
+typedef enum CLK_SCLKSEL_enum
+{
+    CLK_SCLKSEL_RC2M_gc = (0x00<<0),  /* Internal 2 MHz RC Oscillator */
+    CLK_SCLKSEL_RC32M_gc = (0x01<<0),  /* Internal 32 MHz RC Oscillator */
+    CLK_SCLKSEL_RC32K_gc = (0x02<<0),  /* Internal 32.768 kHz RC Oscillator */
+    CLK_SCLKSEL_XOSC_gc = (0x03<<0),  /* External Crystal Oscillator or Clock */
+    CLK_SCLKSEL_PLL_gc = (0x04<<0),  /* Phase Locked Loop */
+} CLK_SCLKSEL_t;
+
+/* Prescaler A Division Factor */
+typedef enum CLK_PSADIV_enum
+{
+    CLK_PSADIV_1_gc = (0x00<<2),  /* Divide by 1 */
+    CLK_PSADIV_2_gc = (0x01<<2),  /* Divide by 2 */
+    CLK_PSADIV_4_gc = (0x03<<2),  /* Divide by 4 */
+    CLK_PSADIV_8_gc = (0x05<<2),  /* Divide by 8 */
+    CLK_PSADIV_16_gc = (0x07<<2),  /* Divide by 16 */
+    CLK_PSADIV_32_gc = (0x09<<2),  /* Divide by 32 */
+    CLK_PSADIV_64_gc = (0x0B<<2),  /* Divide by 64 */
+    CLK_PSADIV_128_gc = (0x0D<<2),  /* Divide by 128 */
+    CLK_PSADIV_256_gc = (0x0F<<2),  /* Divide by 256 */
+    CLK_PSADIV_512_gc = (0x11<<2),  /* Divide by 512 */
+} CLK_PSADIV_t;
+
+/* Prescaler B and C Division Factor */
+typedef enum CLK_PSBCDIV_enum
+{
+    CLK_PSBCDIV_1_1_gc = (0x00<<0),  /* Divide B by 1 and C by 1 */
+    CLK_PSBCDIV_1_2_gc = (0x01<<0),  /* Divide B by 1 and C by 2 */
+    CLK_PSBCDIV_4_1_gc = (0x02<<0),  /* Divide B by 4 and C by 1 */
+    CLK_PSBCDIV_2_2_gc = (0x03<<0),  /* Divide B by 2 and C by 2 */
+} CLK_PSBCDIV_t;
+
+/* RTC Clock Source */
+typedef enum CLK_RTCSRC_enum
+{
+    CLK_RTCSRC_ULP_gc = (0x00<<1),  /* 1.024 kHz from internal 32kHz ULP */
+    CLK_RTCSRC_TOSC_gc = (0x01<<1),  /* 1.024 kHz from 32.768 kHz crystal oscillator on TOSC */
+    CLK_RTCSRC_RCOSC_gc = (0x02<<1),  /* 1.024 kHz from internal 32.768 kHz RC oscillator */
+    CLK_RTCSRC_TOSC32_gc = (0x05<<1),  /* 32.768 kHz from 32.768 kHz crystal oscillator on TOSC */
+    CLK_RTCSRC_RCOSC32_gc = (0x06<<1),  /* 32.768 kHz from internal 32.768 kHz RC oscillator */
+    CLK_RTCSRC_EXTCLK_gc = (0x07<<1),  /* External Clock from TOSC1 */
+} CLK_RTCSRC_t;
+
+/* USB Prescaler Division Factor */
+typedef enum CLK_USBPSDIV_enum
+{
+    CLK_USBPSDIV_1_gc = (0x00<<3),  /* Divide by 1 */
+    CLK_USBPSDIV_2_gc = (0x01<<3),  /* Divide by 2 */
+    CLK_USBPSDIV_4_gc = (0x02<<3),  /* Divide by 4 */
+    CLK_USBPSDIV_8_gc = (0x03<<3),  /* Divide by 8 */
+    CLK_USBPSDIV_16_gc = (0x04<<3),  /* Divide by 16 */
+    CLK_USBPSDIV_32_gc = (0x05<<3),  /* Divide by 32 */
+} CLK_USBPSDIV_t;
+
+/* USB Clock Source */
+typedef enum CLK_USBSRC_enum
+{
+    CLK_USBSRC_PLL_gc = (0x00<<1),  /* PLL */
+    CLK_USBSRC_RC32M_gc = (0x01<<1),  /* Internal 32 MHz RC Oscillator */
+} CLK_USBSRC_t;
+
+
+/*
+--------------------------------------------------------------------------
+SLEEP - Sleep Controller
+--------------------------------------------------------------------------
+*/
+
+/* Sleep Controller */
+typedef struct SLEEP_struct
+{
+    register8_t CTRL;  /* Control Register */
+} SLEEP_t;
+
+/* Sleep Mode */
+typedef enum SLEEP_SMODE_enum
+{
+    SLEEP_SMODE_IDLE_gc = (0x00<<1),  /* Idle mode */
+    SLEEP_SMODE_PDOWN_gc = (0x02<<1),  /* Power-down Mode */
+    SLEEP_SMODE_PSAVE_gc = (0x03<<1),  /* Power-save Mode */
+    SLEEP_SMODE_STDBY_gc = (0x06<<1),  /* Standby Mode */
+    SLEEP_SMODE_ESTDBY_gc = (0x07<<1),  /* Extended Standby Mode */
+} SLEEP_SMODE_t;
+
+
+
+#define SLEEP_MODE_IDLE (0x00<<1)
+#define SLEEP_MODE_PWR_DOWN (0x02<<1)
+#define SLEEP_MODE_PWR_SAVE (0x03<<1)
+#define SLEEP_MODE_STANDBY (0x06<<1)
+#define SLEEP_MODE_EXT_STANDBY (0x07<<1)
+/*
+--------------------------------------------------------------------------
+OSC - Oscillator
+--------------------------------------------------------------------------
+*/
+
+/* Oscillator */
+typedef struct OSC_struct
+{
+    register8_t CTRL;  /* Control Register */
+    register8_t STATUS;  /* Status Register */
+    register8_t XOSCCTRL;  /* External Oscillator Control Register */
+    register8_t XOSCFAIL;  /* Oscillator Failure Detection Register */
+    register8_t RC32KCAL;  /* 32.768 kHz Internal Oscillator Calibration Register */
+    register8_t PLLCTRL;  /* PLL Control Register */
+    register8_t DFLLCTRL;  /* DFLL Control Register */
+} OSC_t;
+
+/* Oscillator Frequency Range */
+typedef enum OSC_FRQRANGE_enum
+{
+    OSC_FRQRANGE_04TO2_gc = (0x00<<6),  /* 0.4 - 2 MHz */
+    OSC_FRQRANGE_2TO9_gc = (0x01<<6),  /* 2 - 9 MHz */
+    OSC_FRQRANGE_9TO12_gc = (0x02<<6),  /* 9 - 12 MHz */
+    OSC_FRQRANGE_12TO16_gc = (0x03<<6),  /* 12 - 16 MHz */
+} OSC_FRQRANGE_t;
+
+/* External Oscillator Selection and Startup Time */
+typedef enum OSC_XOSCSEL_enum
+{
+    OSC_XOSCSEL_EXTCLK_gc = (0x00<<0),  /* External Clock - 6 CLK */
+    OSC_XOSCSEL_32KHz_gc = (0x02<<0),  /* 32.768 kHz TOSC - 32K CLK */
+    OSC_XOSCSEL_XTAL_256CLK_gc = (0x03<<0),  /* 0.4-16 MHz XTAL - 256 CLK */
+    OSC_XOSCSEL_XTAL_1KCLK_gc = (0x07<<0),  /* 0.4-16 MHz XTAL - 1K CLK */
+    OSC_XOSCSEL_XTAL_16KCLK_gc = (0x0B<<0),  /* 0.4-16 MHz XTAL - 16K CLK */
+} OSC_XOSCSEL_t;
+
+/* PLL Clock Source */
+typedef enum OSC_PLLSRC_enum
+{
+    OSC_PLLSRC_RC2M_gc = (0x00<<6),  /* Internal 2 MHz RC Oscillator */
+    OSC_PLLSRC_RC32M_gc = (0x02<<6),  /* Internal 32 MHz RC Oscillator */
+    OSC_PLLSRC_XOSC_gc = (0x03<<6),  /* External Oscillator */
+} OSC_PLLSRC_t;
+
+/* 2 MHz DFLL Calibration Reference */
+typedef enum OSC_RC2MCREF_enum
+{
+    OSC_RC2MCREF_RC32K_gc = (0x00<<0),  /* Internal 32.768 kHz RC Oscillator */
+    OSC_RC2MCREF_XOSC32K_gc = (0x01<<0),  /* External 32.768 kHz Crystal Oscillator */
+} OSC_RC2MCREF_t;
+
+/* 32 MHz DFLL Calibration Reference */
+typedef enum OSC_RC32MCREF_enum
+{
+    OSC_RC32MCREF_RC32K_gc = (0x00<<1),  /* Internal 32.768 kHz RC Oscillator */
+    OSC_RC32MCREF_XOSC32K_gc = (0x01<<1),  /* External 32.768 kHz Crystal Oscillator */
+    OSC_RC32MCREF_USBSOF_gc = (0x02<<1),  /* USB Start of Frame */
+} OSC_RC32MCREF_t;
+
+
+/*
+--------------------------------------------------------------------------
+DFLL - DFLL
+--------------------------------------------------------------------------
+*/
+
+/* DFLL */
+typedef struct DFLL_struct
+{
+    register8_t CTRL;  /* Control Register */
+    register8_t reserved_0x01;
+    register8_t CALA;  /* Calibration Register A */
+    register8_t CALB;  /* Calibration Register B */
+    register8_t COMP0;  /* Oscillator Compare Register 0 */
+    register8_t COMP1;  /* Oscillator Compare Register 1 */
+    register8_t COMP2;  /* Oscillator Compare Register 2 */
+    register8_t reserved_0x07;
+} DFLL_t;
+
+
+/*
+--------------------------------------------------------------------------
+RST - Reset
+--------------------------------------------------------------------------
+*/
+
+/* Reset */
+typedef struct RST_struct
+{
+    register8_t STATUS;  /* Status Register */
+    register8_t CTRL;  /* Control Register */
+} RST_t;
+
+
+/*
+--------------------------------------------------------------------------
+WDT - Watch-Dog Timer
+--------------------------------------------------------------------------
+*/
+
+/* Watch-Dog Timer */
+typedef struct WDT_struct
+{
+    register8_t CTRL;  /* Control */
+    register8_t WINCTRL;  /* Windowed Mode Control */
+    register8_t STATUS;  /* Status */
+} WDT_t;
+
+/* Period setting */
+typedef enum WDT_PER_enum
+{
+    WDT_PER_8CLK_gc = (0x00<<2),  /* 8 cycles (8ms @ 3.3V) */
+    WDT_PER_16CLK_gc = (0x01<<2),  /* 16 cycles (16ms @ 3.3V) */
+    WDT_PER_32CLK_gc = (0x02<<2),  /* 32 cycles (32ms @ 3.3V) */
+    WDT_PER_64CLK_gc = (0x03<<2),  /* 64 cycles (64ms @ 3.3V) */
+    WDT_PER_128CLK_gc = (0x04<<2),  /* 128 cycles (0.128s @ 3.3V) */
+    WDT_PER_256CLK_gc = (0x05<<2),  /* 256 cycles (0.256s @ 3.3V) */
+    WDT_PER_512CLK_gc = (0x06<<2),  /* 512 cycles (0.512s @ 3.3V) */
+    WDT_PER_1KCLK_gc = (0x07<<2),  /* 1K cycles (1s @ 3.3V) */
+    WDT_PER_2KCLK_gc = (0x08<<2),  /* 2K cycles (2s @ 3.3V) */
+    WDT_PER_4KCLK_gc = (0x09<<2),  /* 4K cycles (4s @ 3.3V) */
+    WDT_PER_8KCLK_gc = (0x0A<<2),  /* 8K cycles (8s @ 3.3V) */
+} WDT_PER_t;
+
+/* Closed window period */
+typedef enum WDT_WPER_enum
+{
+    WDT_WPER_8CLK_gc = (0x00<<2),  /* 8 cycles (8ms @ 3.3V) */
+    WDT_WPER_16CLK_gc = (0x01<<2),  /* 16 cycles (16ms @ 3.3V) */
+    WDT_WPER_32CLK_gc = (0x02<<2),  /* 32 cycles (32ms @ 3.3V) */
+    WDT_WPER_64CLK_gc = (0x03<<2),  /* 64 cycles (64ms @ 3.3V) */
+    WDT_WPER_128CLK_gc = (0x04<<2),  /* 128 cycles (0.128s @ 3.3V) */
+    WDT_WPER_256CLK_gc = (0x05<<2),  /* 256 cycles (0.256s @ 3.3V) */
+    WDT_WPER_512CLK_gc = (0x06<<2),  /* 512 cycles (0.512s @ 3.3V) */
+    WDT_WPER_1KCLK_gc = (0x07<<2),  /* 1K cycles (1s @ 3.3V) */
+    WDT_WPER_2KCLK_gc = (0x08<<2),  /* 2K cycles (2s @ 3.3V) */
+    WDT_WPER_4KCLK_gc = (0x09<<2),  /* 4K cycles (4s @ 3.3V) */
+    WDT_WPER_8KCLK_gc = (0x0A<<2),  /* 8K cycles (8s @ 3.3V) */
+} WDT_WPER_t;
+
+
+/*
+--------------------------------------------------------------------------
+MCU - MCU Control
+--------------------------------------------------------------------------
+*/
+
+/* MCU Control */
+typedef struct MCU_struct
+{
+    register8_t DEVID0;  /* Device ID byte 0 */
+    register8_t DEVID1;  /* Device ID byte 1 */
+    register8_t DEVID2;  /* Device ID byte 2 */
+    register8_t REVID;  /* Revision ID */
+    register8_t JTAGUID;  /* JTAG User ID */
+    register8_t reserved_0x05;
+    register8_t MCUCR;  /* MCU Control */
+    register8_t ANAINIT;  /* Analog Startup Delay */
+    register8_t EVSYSLOCK;  /* Event System Lock */
+    register8_t AWEXLOCK;  /* AWEX Lock */
+    register8_t reserved_0x0A;
+    register8_t reserved_0x0B;
+} MCU_t;
+
+
+/*
+--------------------------------------------------------------------------
+PMIC - Programmable Multi-level Interrupt Controller
+--------------------------------------------------------------------------
+*/
+
+/* Programmable Multi-level Interrupt Controller */
+typedef struct PMIC_struct
+{
+    register8_t STATUS;  /* Status Register */
+    register8_t INTPRI;  /* Interrupt Priority */
+    register8_t CTRL;  /* Control Register */
+    register8_t reserved_0x03;
+    register8_t reserved_0x04;
+    register8_t reserved_0x05;
+    register8_t reserved_0x06;
+    register8_t reserved_0x07;
+    register8_t reserved_0x08;
+    register8_t reserved_0x09;
+    register8_t reserved_0x0A;
+    register8_t reserved_0x0B;
+    register8_t reserved_0x0C;
+    register8_t reserved_0x0D;
+    register8_t reserved_0x0E;
+    register8_t reserved_0x0F;
+} PMIC_t;
+
+
+/*
+--------------------------------------------------------------------------
+PORTCFG - Port Configuration
+--------------------------------------------------------------------------
+*/
+
+/* I/O port Configuration */
+typedef struct PORTCFG_struct
+{
+    register8_t MPCMASK;  /* Multi-pin Configuration Mask */
+    register8_t reserved_0x01;
+    register8_t VPCTRLA;  /* Virtual Port Control Register A */
+    register8_t VPCTRLB;  /* Virtual Port Control Register B */
+    register8_t CLKEVOUT;  /* Clock and Event Out Register */
+    register8_t EBIOUT;  /* EBI Output register */
+    register8_t EVOUTSEL;  /* Event Output Select */
+} PORTCFG_t;
+
+/* Virtual Port Mapping */
+typedef enum PORTCFG_VP02MAP_enum
+{
+    PORTCFG_VP02MAP_PORTA_gc = (0x00<<0),  /* Mapped To PORTA */
+    PORTCFG_VP02MAP_PORTB_gc = (0x01<<0),  /* Mapped To PORTB */
+    PORTCFG_VP02MAP_PORTC_gc = (0x02<<0),  /* Mapped To PORTC */
+    PORTCFG_VP02MAP_PORTD_gc = (0x03<<0),  /* Mapped To PORTD */
+    PORTCFG_VP02MAP_PORTE_gc = (0x04<<0),  /* Mapped To PORTE */
+    PORTCFG_VP02MAP_PORTF_gc = (0x05<<0),  /* Mapped To PORTF */
+    PORTCFG_VP02MAP_PORTG_gc = (0x06<<0),  /* Mapped To PORTG */
+    PORTCFG_VP02MAP_PORTH_gc = (0x07<<0),  /* Mapped To PORTH */
+    PORTCFG_VP02MAP_PORTJ_gc = (0x08<<0),  /* Mapped To PORTJ */
+    PORTCFG_VP02MAP_PORTK_gc = (0x09<<0),  /* Mapped To PORTK */
+    PORTCFG_VP02MAP_PORTL_gc = (0x0A<<0),  /* Mapped To PORTL */
+    PORTCFG_VP02MAP_PORTM_gc = (0x0B<<0),  /* Mapped To PORTM */
+    PORTCFG_VP02MAP_PORTN_gc = (0x0C<<0),  /* Mapped To PORTN */
+    PORTCFG_VP02MAP_PORTP_gc = (0x0D<<0),  /* Mapped To PORTP */
+    PORTCFG_VP02MAP_PORTQ_gc = (0x0E<<0),  /* Mapped To PORTQ */
+    PORTCFG_VP02MAP_PORTR_gc = (0x0F<<0),  /* Mapped To PORTR */
+} PORTCFG_VP02MAP_t;
+
+/* Virtual Port Mapping */
+typedef enum PORTCFG_VP13MAP_enum
+{
+    PORTCFG_VP13MAP_PORTA_gc = (0x00<<4),  /* Mapped To PORTA */
+    PORTCFG_VP13MAP_PORTB_gc = (0x01<<4),  /* Mapped To PORTB */
+    PORTCFG_VP13MAP_PORTC_gc = (0x02<<4),  /* Mapped To PORTC */
+    PORTCFG_VP13MAP_PORTD_gc = (0x03<<4),  /* Mapped To PORTD */
+    PORTCFG_VP13MAP_PORTE_gc = (0x04<<4),  /* Mapped To PORTE */
+    PORTCFG_VP13MAP_PORTF_gc = (0x05<<4),  /* Mapped To PORTF */
+    PORTCFG_VP13MAP_PORTG_gc = (0x06<<4),  /* Mapped To PORTG */
+    PORTCFG_VP13MAP_PORTH_gc = (0x07<<4),  /* Mapped To PORTH */
+    PORTCFG_VP13MAP_PORTJ_gc = (0x08<<4),  /* Mapped To PORTJ */
+    PORTCFG_VP13MAP_PORTK_gc = (0x09<<4),  /* Mapped To PORTK */
+    PORTCFG_VP13MAP_PORTL_gc = (0x0A<<4),  /* Mapped To PORTL */
+    PORTCFG_VP13MAP_PORTM_gc = (0x0B<<4),  /* Mapped To PORTM */
+    PORTCFG_VP13MAP_PORTN_gc = (0x0C<<4),  /* Mapped To PORTN */
+    PORTCFG_VP13MAP_PORTP_gc = (0x0D<<4),  /* Mapped To PORTP */
+    PORTCFG_VP13MAP_PORTQ_gc = (0x0E<<4),  /* Mapped To PORTQ */
+    PORTCFG_VP13MAP_PORTR_gc = (0x0F<<4),  /* Mapped To PORTR */
+} PORTCFG_VP13MAP_t;
+
+/* System Clock Output Port */
+typedef enum PORTCFG_CLKOUT_enum
+{
+    PORTCFG_CLKOUT_OFF_gc = (0x00<<0),  /* System Clock Output Disabled */
+    PORTCFG_CLKOUT_PC7_gc = (0x01<<0),  /* System Clock Output on Port C pin 7 */
+    PORTCFG_CLKOUT_PD7_gc = (0x02<<0),  /* System Clock Output on Port D pin 7 */
+    PORTCFG_CLKOUT_PE7_gc = (0x03<<0),  /* System Clock Output on Port E pin 7 */
+} PORTCFG_CLKOUT_t;
+
+/* Peripheral Clock Output Select */
+typedef enum PORTCFG_CLKOUTSEL_enum
+{
+    PORTCFG_CLKOUTSEL_CLK1X_gc = (0x00<<2),  /* 1x Peripheral Clock Output to pin */
+    PORTCFG_CLKOUTSEL_CLK2X_gc = (0x01<<2),  /* 2x Peripheral Clock Output to pin */
+    PORTCFG_CLKOUTSEL_CLK4X_gc = (0x02<<2),  /* 4x Peripheral Clock Output to pin */
+} PORTCFG_CLKOUTSEL_t;
+
+/* Event Output Port */
+typedef enum PORTCFG_EVOUT_enum
+{
+    PORTCFG_EVOUT_OFF_gc = (0x00<<4),  /* Event Output Disabled */
+    PORTCFG_EVOUT_PC7_gc = (0x01<<4),  /* Event Channel 7 Output on Port C pin 7 */
+    PORTCFG_EVOUT_PD7_gc = (0x02<<4),  /* Event Channel 7 Output on Port D pin 7 */
+    PORTCFG_EVOUT_PE7_gc = (0x03<<4),  /* Event Channel 7 Output on Port E pin 7 */
+} PORTCFG_EVOUT_t;
+
+/* Clock and Event Output Port */
+typedef enum PORTCFG_CLKEVPIN_enum
+{
+    PORTCFG_CLKEVPIN_PIN7_gc = (0x00<<7),  /* Clock and Event Ouput on PIN 7 */
+    PORTCFG_CLKEVPIN_PIN4_gc = (0x01<<7),  /* Clock and Event Ouput on PIN 4 */
+} PORTCFG_CLKEVPIN_t;
+
+/* EBI Address Output Port */
+typedef enum PORTCFG_EBIADROUT_enum
+{
+    PORTCFG_EBIADROUT_PF_gc = (0x00<<2),  /* EBI port 3 address output on PORTF pins 0 to 7 */
+    PORTCFG_EBIADROUT_PE_gc = (0x01<<2),  /* EBI port 3 address output on PORTE pins 0 to 7 */
+    PORTCFG_EBIADROUT_PFH_gc = (0x02<<2),  /* EBI port 3 address output on PORTF pins 4 to 7 */
+    PORTCFG_EBIADROUT_PEH_gc = (0x03<<2),  /* EBI port 3 address output on PORTE pins 4 to 7 */
+} PORTCFG_EBIADROUT_t;
+
+/* EBI Chip Select Output Port */
+typedef enum PORTCFG_EBICSOUT_enum
+{
+    PORTCFG_EBICSOUT_PH_gc = (0x00<<0),  /* EBI chip select output to PORTH pin 4 to 7 */
+    PORTCFG_EBICSOUT_PL_gc = (0x01<<0),  /* EBI chip select output to PORTL pin 4 to 7 */
+    PORTCFG_EBICSOUT_PF_gc = (0x02<<0),  /* EBI chip select output to PORTF pin 4 to 7 */
+    PORTCFG_EBICSOUT_PE_gc = (0x03<<0),  /* EBI chip select output to PORTE pin 4 to 7 */
+} PORTCFG_EBICSOUT_t;
+
+/* Event Output Select */
+typedef enum PORTCFG_EVOUTSEL_enum
+{
+    PORTCFG_EVOUTSEL_0_gc = (0x00<<0),  /* Event Channel 0 output to pin */
+    PORTCFG_EVOUTSEL_1_gc = (0x01<<0),  /* Event Channel 1 output to pin */
+    PORTCFG_EVOUTSEL_2_gc = (0x02<<0),  /* Event Channel 2 output to pin */
+    PORTCFG_EVOUTSEL_3_gc = (0x03<<0),  /* Event Channel 3 output to pin */
+    PORTCFG_EVOUTSEL_4_gc = (0x04<<0),  /* Event Channel 4 output to pin */
+    PORTCFG_EVOUTSEL_5_gc = (0x05<<0),  /* Event Channel 5 output to pin */
+    PORTCFG_EVOUTSEL_6_gc = (0x06<<0),  /* Event Channel 6 output to pin */
+    PORTCFG_EVOUTSEL_7_gc = (0x07<<0),  /* Event Channel 7 output to pin */
+} PORTCFG_EVOUTSEL_t;
+
+
+/*
+--------------------------------------------------------------------------
+AES - AES Module
+--------------------------------------------------------------------------
+*/
+
+/* AES Module */
+typedef struct AES_struct
+{
+    register8_t CTRL;  /* AES Control Register */
+    register8_t STATUS;  /* AES Status Register */
+    register8_t STATE;  /* AES State Register */
+    register8_t KEY;  /* AES Key Register */
+    register8_t INTCTRL;  /* AES Interrupt Control Register */
+} AES_t;
+
+/* Interrupt level */
+typedef enum AES_INTLVL_enum
+{
+    AES_INTLVL_OFF_gc = (0x00<<0),  /* Interrupt Disabled */
+    AES_INTLVL_LO_gc = (0x01<<0),  /* Low Level */
+    AES_INTLVL_MED_gc = (0x02<<0),  /* Medium Level */
+    AES_INTLVL_HI_gc = (0x03<<0),  /* High Level */
+} AES_INTLVL_t;
+
+
+/*
+--------------------------------------------------------------------------
+CRC - Cyclic Redundancy Checker
+--------------------------------------------------------------------------
+*/
+
+/* Cyclic Redundancy Checker */
+typedef struct CRC_struct
+{
+    register8_t CTRL;  /* Control Register */
+    register8_t STATUS;  /* Status Register */
+    register8_t reserved_0x02;
+    register8_t DATAIN;  /* Data Input */
+    register8_t CHECKSUM0;  /* Checksum byte 0 */
+    register8_t CHECKSUM1;  /* Checksum byte 1 */
+    register8_t CHECKSUM2;  /* Checksum byte 2 */
+    register8_t CHECKSUM3;  /* Checksum byte 3 */
+} CRC_t;
+
+/* Reset */
+typedef enum CRC_RESET_enum
+{
+    CRC_RESET_NO_gc = (0x00<<6),  /* No Reset */
+    CRC_RESET_RESET0_gc = (0x02<<6),  /* Reset CRC with CHECKSUM to all zeros */
+    CRC_RESET_RESET1_gc = (0x03<<6),  /* Reset CRC with CHECKSUM to all ones */
+} CRC_RESET_t;
+
+/* Input Source */
+typedef enum CRC_SOURCE_enum
+{
+    CRC_SOURCE_DISABLE_gc = (0x00<<0),  /* Disabled */
+    CRC_SOURCE_IO_gc = (0x01<<0),  /* I/O Interface */
+    CRC_SOURCE_FLASH_gc = (0x02<<0),  /* Flash */
+    CRC_SOURCE_DMAC0_gc = (0x04<<0),  /* DMAC Channel 0 */
+    CRC_SOURCE_DMAC1_gc = (0x05<<0),  /* DMAC Channel 1 */
+    CRC_SOURCE_DMAC2_gc = (0x06<<0),  /* DMAC Channel 2 */
+    CRC_SOURCE_DMAC3_gc = (0x07<<0),  /* DMAC Channel 3 */
+} CRC_SOURCE_t;
+
+
+/*
+--------------------------------------------------------------------------
+DMA - DMA Controller
+--------------------------------------------------------------------------
+*/
+
+/* DMA Channel */
+typedef struct DMA_CH_struct
+{
+    register8_t CTRLA;  /* Channel Control */
+    register8_t CTRLB;  /* Channel Control */
+    register8_t ADDRCTRL;  /* Address Control */
+    register8_t TRIGSRC;  /* Channel Trigger Source */
+    _WORDREGISTER(TRFCNT);  /* Channel Block Transfer Count */
+    register8_t REPCNT;  /* Channel Repeat Count */
+    register8_t reserved_0x07;
+    register8_t SRCADDR0;  /* Channel Source Address 0 */
+    register8_t SRCADDR1;  /* Channel Source Address 1 */
+    register8_t SRCADDR2;  /* Channel Source Address 2 */
+    register8_t reserved_0x0B;
+    register8_t DESTADDR0;  /* Channel Destination Address 0 */
+    register8_t DESTADDR1;  /* Channel Destination Address 1 */
+    register8_t DESTADDR2;  /* Channel Destination Address 2 */
+    register8_t reserved_0x0F;
+} DMA_CH_t;
+
+
+/* DMA Controller */
+typedef struct DMA_struct
+{
+    register8_t CTRL;  /* Control */
+    register8_t reserved_0x01;
+    register8_t reserved_0x02;
+    register8_t INTFLAGS;  /* Transfer Interrupt Status */
+    register8_t STATUS;  /* Status */
+    register8_t reserved_0x05;
+    _WORDREGISTER(TEMP);  /* Temporary Register For 16/24-bit Access */
+    register8_t reserved_0x08;
+    register8_t reserved_0x09;
+    register8_t reserved_0x0A;
+    register8_t reserved_0x0B;
+    register8_t reserved_0x0C;
+    register8_t reserved_0x0D;
+    register8_t reserved_0x0E;
+    register8_t reserved_0x0F;
+    DMA_CH_t CH0;  /* DMA Channel 0 */
+    DMA_CH_t CH1;  /* DMA Channel 1 */
+    DMA_CH_t CH2;  /* DMA Channel 2 */
+    DMA_CH_t CH3;  /* DMA Channel 3 */
+} DMA_t;
+
+/* Burst mode */
+typedef enum DMA_CH_BURSTLEN_enum
+{
+    DMA_CH_BURSTLEN_1BYTE_gc = (0x00<<0),  /* 1-byte burst mode */
+    DMA_CH_BURSTLEN_2BYTE_gc = (0x01<<0),  /* 2-byte burst mode */
+    DMA_CH_BURSTLEN_4BYTE_gc = (0x02<<0),  /* 4-byte burst mode */
+    DMA_CH_BURSTLEN_8BYTE_gc = (0x03<<0),  /* 8-byte burst mode */
+} DMA_CH_BURSTLEN_t;
+
+/* Source address reload mode */
+typedef enum DMA_CH_SRCRELOAD_enum
+{
+    DMA_CH_SRCRELOAD_NONE_gc = (0x00<<6),  /* No reload */
+    DMA_CH_SRCRELOAD_BLOCK_gc = (0x01<<6),  /* Reload at end of block */
+    DMA_CH_SRCRELOAD_BURST_gc = (0x02<<6),  /* Reload at end of burst */
+    DMA_CH_SRCRELOAD_TRANSACTION_gc = (0x03<<6),  /* Reload at end of transaction */
+} DMA_CH_SRCRELOAD_t;
+
+/* Source addressing mode */
+typedef enum DMA_CH_SRCDIR_enum
+{
+    DMA_CH_SRCDIR_FIXED_gc = (0x00<<4),  /* Fixed */
+    DMA_CH_SRCDIR_INC_gc = (0x01<<4),  /* Increment */
+    DMA_CH_SRCDIR_DEC_gc = (0x02<<4),  /* Decrement */
+} DMA_CH_SRCDIR_t;
+
+/* Destination adress reload mode */
+typedef enum DMA_CH_DESTRELOAD_enum
+{
+    DMA_CH_DESTRELOAD_NONE_gc = (0x00<<2),  /* No reload */
+    DMA_CH_DESTRELOAD_BLOCK_gc = (0x01<<2),  /* Reload at end of block */
+    DMA_CH_DESTRELOAD_BURST_gc = (0x02<<2),  /* Reload at end of burst */
+    DMA_CH_DESTRELOAD_TRANSACTION_gc = (0x03<<2),  /* Reload at end of transaction */
+} DMA_CH_DESTRELOAD_t;
+
+/* Destination adressing mode */
+typedef enum DMA_CH_DESTDIR_enum
+{
+    DMA_CH_DESTDIR_FIXED_gc = (0x00<<0),  /* Fixed */
+    DMA_CH_DESTDIR_INC_gc = (0x01<<0),  /* Increment */
+    DMA_CH_DESTDIR_DEC_gc = (0x02<<0),  /* Decrement */
+} DMA_CH_DESTDIR_t;
+
+/* Transfer trigger source */
+typedef enum DMA_CH_TRIGSRC_enum
+{
+    DMA_CH_TRIGSRC_OFF_gc = (0x00<<0),  /* Off software triggers only */
+    DMA_CH_TRIGSRC_EVSYS_CH0_gc = (0x01<<0),  /* Event System Channel 0 */
+    DMA_CH_TRIGSRC_EVSYS_CH1_gc = (0x02<<0),  /* Event System Channel 1 */
+    DMA_CH_TRIGSRC_EVSYS_CH2_gc = (0x03<<0),  /* Event System Channel 2 */
+    DMA_CH_TRIGSRC_ADCA_CH0_gc = (0x10<<0),  /* ADCA Channel 0 */
+    DMA_CH_TRIGSRC_ADCA_CH1_gc = (0x11<<0),  /* ADCA Channel 1 */
+    DMA_CH_TRIGSRC_ADCA_CH2_gc = (0x12<<0),  /* ADCA Channel 2 */
+    DMA_CH_TRIGSRC_ADCA_CH3_gc = (0x13<<0),  /* ADCA Channel 3 */
+    DMA_CH_TRIGSRC_ADCA_CH4_gc = (0x14<<0),  /* ADCA Channel 0,1,2,3 combined */
+    DMA_CH_TRIGSRC_DACA_CH0_gc = (0x15<<0),  /* DACA Channel 0 */
+    DMA_CH_TRIGSRC_DACA_CH1_gc = (0x16<<0),  /* DACA Channel 1 */
+    DMA_CH_TRIGSRC_ADCB_CH0_gc = (0x20<<0),  /* ADCB Channel 0 */
+    DMA_CH_TRIGSRC_ADCB_CH1_gc = (0x21<<0),  /* ADCB Channel 1 */
+    DMA_CH_TRIGSRC_ADCB_CH2_gc = (0x22<<0),  /* ADCB Channel 2 */
+    DMA_CH_TRIGSRC_ADCB_CH3_gc = (0x23<<0),  /* ADCB Channel 3 */
+    DMA_CH_TRIGSRC_ADCB_CH4_gc = (0x24<<0),  /* ADCB Channel 0,1,2,3 combined */
+    DMA_CH_TRIGSRC_DACB_CH0_gc = (0x25<<0),  /* DACB Channel 0 */
+    DMA_CH_TRIGSRC_DACB_CH1_gc = (0x26<<0),  /* DACB Channel 1 */
+    DMA_CH_TRIGSRC_TCC0_OVF_gc = (0x40<<0),  /* Timer/Counter C0 Overflow */
+    DMA_CH_TRIGSRC_TCC0_ERR_gc = (0x41<<0),  /* Timer/Counter C0 Error */
+    DMA_CH_TRIGSRC_TCC0_CCA_gc = (0x42<<0),  /* Timer/Counter C0 Compare or Capture A */
+    DMA_CH_TRIGSRC_TCC0_CCB_gc = (0x43<<0),  /* Timer/Counter C0 Compare or Capture B */
+    DMA_CH_TRIGSRC_TCC0_CCC_gc = (0x44<<0),  /* Timer/Counter C0 Compare or Capture C */
+    DMA_CH_TRIGSRC_TCC0_CCD_gc = (0x45<<0),  /* Timer/Counter C0 Compare or Capture D */
+    DMA_CH_TRIGSRC_TCC1_OVF_gc = (0x46<<0),  /* Timer/Counter C1 Overflow */
+    DMA_CH_TRIGSRC_TCC1_ERR_gc = (0x47<<0),  /* Timer/Counter C1 Error */
+    DMA_CH_TRIGSRC_TCC1_CCA_gc = (0x48<<0),  /* Timer/Counter C1 Compare or Capture A */
+    DMA_CH_TRIGSRC_TCC1_CCB_gc = (0x49<<0),  /* Timer/Counter C1 Compare or Capture B */
+    DMA_CH_TRIGSRC_SPIC_gc = (0x4A<<0),  /* SPI C Transfer Complete */
+    DMA_CH_TRIGSRC_USARTC0_RXC_gc = (0x4B<<0),  /* USART C0 Receive Complete */
+    DMA_CH_TRIGSRC_USARTC0_DRE_gc = (0x4C<<0),  /* USART C0 Data Register Empty */
+    DMA_CH_TRIGSRC_USARTC1_RXC_gc = (0x4E<<0),  /* USART C1 Receive Complete */
+    DMA_CH_TRIGSRC_USARTC1_DRE_gc = (0x4F<<0),  /* USART C1 Data Register Empty */
+    DMA_CH_TRIGSRC_TCD0_OVF_gc = (0x60<<0),  /* Timer/Counter D0 Overflow */
+    DMA_CH_TRIGSRC_TCD0_ERR_gc = (0x61<<0),  /* Timer/Counter D0 Error */
+    DMA_CH_TRIGSRC_TCD0_CCA_gc = (0x62<<0),  /* Timer/Counter D0 Compare or Capture A */
+    DMA_CH_TRIGSRC_TCD0_CCB_gc = (0x63<<0),  /* Timer/Counter D0 Compare or Capture B */
+    DMA_CH_TRIGSRC_TCD0_CCC_gc = (0x64<<0),  /* Timer/Counter D0 Compare or Capture C */
+    DMA_CH_TRIGSRC_TCD0_CCD_gc = (0x65<<0),  /* Timer/Counter D0 Compare or Capture D */
+    DMA_CH_TRIGSRC_TCD1_OVF_gc = (0x66<<0),  /* Timer/Counter D1 Overflow */
+    DMA_CH_TRIGSRC_TCD1_ERR_gc = (0x67<<0),  /* Timer/Counter D1 Error */
+    DMA_CH_TRIGSRC_TCD1_CCA_gc = (0x68<<0),  /* Timer/Counter D1 Compare or Capture A */
+    DMA_CH_TRIGSRC_TCD1_CCB_gc = (0x69<<0),  /* Timer/Counter D1 Compare or Capture B */
+    DMA_CH_TRIGSRC_SPID_gc = (0x6A<<0),  /* SPI D Transfer Complete */
+    DMA_CH_TRIGSRC_USARTD0_RXC_gc = (0x6B<<0),  /* USART D0 Receive Complete */
+    DMA_CH_TRIGSRC_USARTD0_DRE_gc = (0x6C<<0),  /* USART D0 Data Register Empty */
+    DMA_CH_TRIGSRC_USARTD1_RXC_gc = (0x6E<<0),  /* USART D1 Receive Complete */
+    DMA_CH_TRIGSRC_USARTD1_DRE_gc = (0x6F<<0),  /* USART D1 Data Register Empty */
+    DMA_CH_TRIGSRC_TCE0_OVF_gc = (0x80<<0),  /* Timer/Counter E0 Overflow */
+    DMA_CH_TRIGSRC_TCE0_ERR_gc = (0x81<<0),  /* Timer/Counter E0 Error */
+    DMA_CH_TRIGSRC_TCE0_CCA_gc = (0x82<<0),  /* Timer/Counter E0 Compare or Capture A */
+    DMA_CH_TRIGSRC_TCE0_CCB_gc = (0x83<<0),  /* Timer/Counter E0 Compare or Capture B */
+    DMA_CH_TRIGSRC_TCE0_CCC_gc = (0x84<<0),  /* Timer/Counter E0 Compare or Capture C */
+    DMA_CH_TRIGSRC_TCE0_CCD_gc = (0x85<<0),  /* Timer/Counter E0 Compare or Capture D */
+    DMA_CH_TRIGSRC_TCE1_OVF_gc = (0x86<<0),  /* Timer/Counter E1 Overflow */
+    DMA_CH_TRIGSRC_TCE1_ERR_gc = (0x87<<0),  /* Timer/Counter E1 Error */
+    DMA_CH_TRIGSRC_TCE1_CCA_gc = (0x88<<0),  /* Timer/Counter E1 Compare or Capture A */
+    DMA_CH_TRIGSRC_TCE1_CCB_gc = (0x89<<0),  /* Timer/Counter E1 Compare or Capture B */
+    DMA_CH_TRIGSRC_SPIE_gc = (0x8A<<0),  /* SPI E Transfer Complete */
+    DMA_CH_TRIGSRC_USARTE0_RXC_gc = (0x8B<<0),  /* USART E0 Receive Complete */
+    DMA_CH_TRIGSRC_USARTE0_DRE_gc = (0x8C<<0),  /* USART E0 Data Register Empty */
+    DMA_CH_TRIGSRC_USARTE1_RXC_gc = (0x8E<<0),  /* USART E1 Receive Complete */
+    DMA_CH_TRIGSRC_USARTE1_DRE_gc = (0x8F<<0),  /* USART E1 Data Register Empty */
+    DMA_CH_TRIGSRC_TCF0_OVF_gc = (0xA0<<0),  /* Timer/Counter F0 Overflow */
+    DMA_CH_TRIGSRC_TCF0_ERR_gc = (0xA1<<0),  /* Timer/Counter F0 Error */
+    DMA_CH_TRIGSRC_TCF0_CCA_gc = (0xA2<<0),  /* Timer/Counter F0 Compare or Capture A */
+    DMA_CH_TRIGSRC_TCF0_CCB_gc = (0xA3<<0),  /* Timer/Counter F0 Compare or Capture B */
+    DMA_CH_TRIGSRC_TCF0_CCC_gc = (0xA4<<0),  /* Timer/Counter F0 Compare or Capture C */
+    DMA_CH_TRIGSRC_TCF0_CCD_gc = (0xA5<<0),  /* Timer/Counter F0 Compare or Capture D */
+    DMA_CH_TRIGSRC_TCF1_OVF_gc = (0xA6<<0),  /* Timer/Counter F1 Overflow */
+    DMA_CH_TRIGSRC_TCF1_ERR_gc = (0xA7<<0),  /* Timer/Counter F1 Error */
+    DMA_CH_TRIGSRC_TCF1_CCA_gc = (0xA8<<0),  /* Timer/Counter F1 Compare or Capture A */
+    DMA_CH_TRIGSRC_TCF1_CCB_gc = (0xA9<<0),  /* Timer/Counter F1 Compare or Capture B */
+    DMA_CH_TRIGSRC_SPIF_gc = (0xAA<<0),  /* SPI F Transfer Complete */
+    DMA_CH_TRIGSRC_USARTF0_RXC_gc = (0xAB<<0),  /* USART F0 Receive Complete */
+    DMA_CH_TRIGSRC_USARTF0_DRE_gc = (0xAC<<0),  /* USART F0 Data Register Empty */
+    DMA_CH_TRIGSRC_USARTF1_RXC_gc = (0xAE<<0),  /* USART F1 Receive Complete */
+    DMA_CH_TRIGSRC_USARTF1_DRE_gc = (0xAF<<0),  /* USART F1 Data Register Empty */
+} DMA_CH_TRIGSRC_t;
+
+/* Double buffering mode */
+typedef enum DMA_DBUFMODE_enum
+{
+    DMA_DBUFMODE_DISABLED_gc = (0x00<<2),  /* Double buffering disabled */
+    DMA_DBUFMODE_CH01_gc = (0x01<<2),  /* Double buffering enabled on channel 0/1 */
+    DMA_DBUFMODE_CH23_gc = (0x02<<2),  /* Double buffering enabled on channel 2/3 */
+    DMA_DBUFMODE_CH01CH23_gc = (0x03<<2),  /* Double buffering enabled on ch. 0/1 and ch. 2/3 */
+} DMA_DBUFMODE_t;
+
+/* Priority mode */
+typedef enum DMA_PRIMODE_enum
+{
+    DMA_PRIMODE_RR0123_gc = (0x00<<0),  /* Round Robin */
+    DMA_PRIMODE_CH0RR123_gc = (0x01<<0),  /* Channel 0 > Round Robin on channel 1/2/3 */
+    DMA_PRIMODE_CH01RR23_gc = (0x02<<0),  /* Channel 0 > channel 1 > Round Robin on channel 2/3 */
+    DMA_PRIMODE_CH0123_gc = (0x03<<0),  /* Channel 0 > channel 1 > channel 2 > channel 3 */
+} DMA_PRIMODE_t;
+
+/* Interrupt level */
+typedef enum DMA_CH_ERRINTLVL_enum
+{
+    DMA_CH_ERRINTLVL_OFF_gc = (0x00<<2),  /* Interrupt disabled */
+    DMA_CH_ERRINTLVL_LO_gc = (0x01<<2),  /* Low level */
+    DMA_CH_ERRINTLVL_MED_gc = (0x02<<2),  /* Medium level */
+    DMA_CH_ERRINTLVL_HI_gc = (0x03<<2),  /* High level */
+} DMA_CH_ERRINTLVL_t;
+
+/* Interrupt level */
+typedef enum DMA_CH_TRNINTLVL_enum
+{
+    DMA_CH_TRNINTLVL_OFF_gc = (0x00<<0),  /* Interrupt disabled */
+    DMA_CH_TRNINTLVL_LO_gc = (0x01<<0),  /* Low level */
+    DMA_CH_TRNINTLVL_MED_gc = (0x02<<0),  /* Medium level */
+    DMA_CH_TRNINTLVL_HI_gc = (0x03<<0),  /* High level */
+} DMA_CH_TRNINTLVL_t;
+
+
+/*
+--------------------------------------------------------------------------
+EVSYS - Event System
+--------------------------------------------------------------------------
+*/
+
+/* Event System */
+typedef struct EVSYS_struct
+{
+    register8_t CH0MUX;  /* Event Channel 0 Multiplexer */
+    register8_t CH1MUX;  /* Event Channel 1 Multiplexer */
+    register8_t CH2MUX;  /* Event Channel 2 Multiplexer */
+    register8_t CH3MUX;  /* Event Channel 3 Multiplexer */
+    register8_t CH4MUX;  /* Event Channel 4 Multiplexer */
+    register8_t CH5MUX;  /* Event Channel 5 Multiplexer */
+    register8_t CH6MUX;  /* Event Channel 6 Multiplexer */
+    register8_t CH7MUX;  /* Event Channel 7 Multiplexer */
+    register8_t CH0CTRL;  /* Channel 0 Control Register */
+    register8_t CH1CTRL;  /* Channel 1 Control Register */
+    register8_t CH2CTRL;  /* Channel 2 Control Register */
+    register8_t CH3CTRL;  /* Channel 3 Control Register */
+    register8_t CH4CTRL;  /* Channel 4 Control Register */
+    register8_t CH5CTRL;  /* Channel 5 Control Register */
+    register8_t CH6CTRL;  /* Channel 6 Control Register */
+    register8_t CH7CTRL;  /* Channel 7 Control Register */
+    register8_t STROBE;  /* Event Strobe */
+    register8_t DATA;  /* Event Data */
+} EVSYS_t;
+
+/* Quadrature Decoder Index Recognition Mode */
+typedef enum EVSYS_QDIRM_enum
+{
+    EVSYS_QDIRM_00_gc = (0x00<<5),  /* QDPH0 = 0, QDPH90 = 0 */
+    EVSYS_QDIRM_01_gc = (0x01<<5),  /* QDPH0 = 0, QDPH90 = 1 */
+    EVSYS_QDIRM_10_gc = (0x02<<5),  /* QDPH0 = 1, QDPH90 = 0 */
+    EVSYS_QDIRM_11_gc = (0x03<<5),  /* QDPH0 = 1, QDPH90 = 1 */
+} EVSYS_QDIRM_t;
+
+/* Digital filter coefficient */
+typedef enum EVSYS_DIGFILT_enum
+{
+    EVSYS_DIGFILT_1SAMPLE_gc = (0x00<<0),  /* 1 SAMPLE */
+    EVSYS_DIGFILT_2SAMPLES_gc = (0x01<<0),  /* 2 SAMPLES */
+    EVSYS_DIGFILT_3SAMPLES_gc = (0x02<<0),  /* 3 SAMPLES */
+    EVSYS_DIGFILT_4SAMPLES_gc = (0x03<<0),  /* 4 SAMPLES */
+    EVSYS_DIGFILT_5SAMPLES_gc = (0x04<<0),  /* 5 SAMPLES */
+    EVSYS_DIGFILT_6SAMPLES_gc = (0x05<<0),  /* 6 SAMPLES */
+    EVSYS_DIGFILT_7SAMPLES_gc = (0x06<<0),  /* 7 SAMPLES */
+    EVSYS_DIGFILT_8SAMPLES_gc = (0x07<<0),  /* 8 SAMPLES */
+} EVSYS_DIGFILT_t;
+
+/* Event Channel multiplexer input selection */
+typedef enum EVSYS_CHMUX_enum
+{
+    EVSYS_CHMUX_OFF_gc = (0x00<<0),  /* Off */
+    EVSYS_CHMUX_RTC_OVF_gc = (0x08<<0),  /* RTC Overflow */
+    EVSYS_CHMUX_RTC_CMP_gc = (0x09<<0),  /* RTC Compare Match */
+    EVSYS_CHMUX_USB_gc = (0x0A<<0),  /* USB Setup, SOF, CRC error and UNF/OVF */
+    EVSYS_CHMUX_ACA_CH0_gc = (0x10<<0),  /* Analog Comparator A Channel 0 */
+    EVSYS_CHMUX_ACA_CH1_gc = (0x11<<0),  /* Analog Comparator A Channel 1 */
+    EVSYS_CHMUX_ACA_WIN_gc = (0x12<<0),  /* Analog Comparator A Window */
+    EVSYS_CHMUX_ACB_CH0_gc = (0x13<<0),  /* Analog Comparator B Channel 0 */
+    EVSYS_CHMUX_ACB_CH1_gc = (0x14<<0),  /* Analog Comparator B Channel 1 */
+    EVSYS_CHMUX_ACB_WIN_gc = (0x15<<0),  /* Analog Comparator B Window */
+    EVSYS_CHMUX_ADCA_CH0_gc = (0x20<<0),  /* ADC A Channel 0 */
+    EVSYS_CHMUX_ADCA_CH1_gc = (0x21<<0),  /* ADC A Channel 1 */
+    EVSYS_CHMUX_ADCA_CH2_gc = (0x22<<0),  /* ADC A Channel 2 */
+    EVSYS_CHMUX_ADCA_CH3_gc = (0x23<<0),  /* ADC A Channel 3 */
+    EVSYS_CHMUX_ADCB_CH0_gc = (0x24<<0),  /* ADC B Channel 0 */
+    EVSYS_CHMUX_ADCB_CH1_gc = (0x25<<0),  /* ADC B Channel 1 */
+    EVSYS_CHMUX_ADCB_CH2_gc = (0x26<<0),  /* ADC B Channel 2 */
+    EVSYS_CHMUX_ADCB_CH3_gc = (0x27<<0),  /* ADC B Channel 3 */
+    EVSYS_CHMUX_PORTA_PIN0_gc = (0x50<<0),  /* Port A, Pin0 */
+    EVSYS_CHMUX_PORTA_PIN1_gc = (0x51<<0),  /* Port A, Pin1 */
+    EVSYS_CHMUX_PORTA_PIN2_gc = (0x52<<0),  /* Port A, Pin2 */
+    EVSYS_CHMUX_PORTA_PIN3_gc = (0x53<<0),  /* Port A, Pin3 */
+    EVSYS_CHMUX_PORTA_PIN4_gc = (0x54<<0),  /* Port A, Pin4 */
+    EVSYS_CHMUX_PORTA_PIN5_gc = (0x55<<0),  /* Port A, Pin5 */
+    EVSYS_CHMUX_PORTA_PIN6_gc = (0x56<<0),  /* Port A, Pin6 */
+    EVSYS_CHMUX_PORTA_PIN7_gc = (0x57<<0),  /* Port A, Pin7 */
+    EVSYS_CHMUX_PORTB_PIN0_gc = (0x58<<0),  /* Port B, Pin0 */
+    EVSYS_CHMUX_PORTB_PIN1_gc = (0x59<<0),  /* Port B, Pin1 */
+    EVSYS_CHMUX_PORTB_PIN2_gc = (0x5A<<0),  /* Port B, Pin2 */
+    EVSYS_CHMUX_PORTB_PIN3_gc = (0x5B<<0),  /* Port B, Pin3 */
+    EVSYS_CHMUX_PORTB_PIN4_gc = (0x5C<<0),  /* Port B, Pin4 */
+    EVSYS_CHMUX_PORTB_PIN5_gc = (0x5D<<0),  /* Port B, Pin5 */
+    EVSYS_CHMUX_PORTB_PIN6_gc = (0x5E<<0),  /* Port B, Pin6 */
+    EVSYS_CHMUX_PORTB_PIN7_gc = (0x5F<<0),  /* Port B, Pin7 */
+    EVSYS_CHMUX_PORTC_PIN0_gc = (0x60<<0),  /* Port C, Pin0 */
+    EVSYS_CHMUX_PORTC_PIN1_gc = (0x61<<0),  /* Port C, Pin1 */
+    EVSYS_CHMUX_PORTC_PIN2_gc = (0x62<<0),  /* Port C, Pin2 */
+    EVSYS_CHMUX_PORTC_PIN3_gc = (0x63<<0),  /* Port C, Pin3 */
+    EVSYS_CHMUX_PORTC_PIN4_gc = (0x64<<0),  /* Port C, Pin4 */
+    EVSYS_CHMUX_PORTC_PIN5_gc = (0x65<<0),  /* Port C, Pin5 */
+    EVSYS_CHMUX_PORTC_PIN6_gc = (0x66<<0),  /* Port C, Pin6 */
+    EVSYS_CHMUX_PORTC_PIN7_gc = (0x67<<0),  /* Port C, Pin7 */
+    EVSYS_CHMUX_PORTD_PIN0_gc = (0x68<<0),  /* Port D, Pin0 */
+    EVSYS_CHMUX_PORTD_PIN1_gc = (0x69<<0),  /* Port D, Pin1 */
+    EVSYS_CHMUX_PORTD_PIN2_gc = (0x6A<<0),  /* Port D, Pin2 */
+    EVSYS_CHMUX_PORTD_PIN3_gc = (0x6B<<0),  /* Port D, Pin3 */
+    EVSYS_CHMUX_PORTD_PIN4_gc = (0x6C<<0),  /* Port D, Pin4 */
+    EVSYS_CHMUX_PORTD_PIN5_gc = (0x6D<<0),  /* Port D, Pin5 */
+    EVSYS_CHMUX_PORTD_PIN6_gc = (0x6E<<0),  /* Port D, Pin6 */
+    EVSYS_CHMUX_PORTD_PIN7_gc = (0x6F<<0),  /* Port D, Pin7 */
+    EVSYS_CHMUX_PORTE_PIN0_gc = (0x70<<0),  /* Port E, Pin0 */
+    EVSYS_CHMUX_PORTE_PIN1_gc = (0x71<<0),  /* Port E, Pin1 */
+    EVSYS_CHMUX_PORTE_PIN2_gc = (0x72<<0),  /* Port E, Pin2 */
+    EVSYS_CHMUX_PORTE_PIN3_gc = (0x73<<0),  /* Port E, Pin3 */
+    EVSYS_CHMUX_PORTE_PIN4_gc = (0x74<<0),  /* Port E, Pin4 */
+    EVSYS_CHMUX_PORTE_PIN5_gc = (0x75<<0),  /* Port E, Pin5 */
+    EVSYS_CHMUX_PORTE_PIN6_gc = (0x76<<0),  /* Port E, Pin6 */
+    EVSYS_CHMUX_PORTE_PIN7_gc = (0x77<<0),  /* Port E, Pin7 */
+    EVSYS_CHMUX_PORTF_PIN0_gc = (0x78<<0),  /* Port F, Pin0 */
+    EVSYS_CHMUX_PORTF_PIN1_gc = (0x79<<0),  /* Port F, Pin1 */
+    EVSYS_CHMUX_PORTF_PIN2_gc = (0x7A<<0),  /* Port F, Pin2 */
+    EVSYS_CHMUX_PORTF_PIN3_gc = (0x7B<<0),  /* Port F, Pin3 */
+    EVSYS_CHMUX_PORTF_PIN4_gc = (0x7C<<0),  /* Port F, Pin4 */
+    EVSYS_CHMUX_PORTF_PIN5_gc = (0x7D<<0),  /* Port F, Pin5 */
+    EVSYS_CHMUX_PORTF_PIN6_gc = (0x7E<<0),  /* Port F, Pin6 */
+    EVSYS_CHMUX_PORTF_PIN7_gc = (0x7F<<0),  /* Port F, Pin7 */
+    EVSYS_CHMUX_PRESCALER_1_gc = (0x80<<0),  /* Prescaler, divide by 1 */
+    EVSYS_CHMUX_PRESCALER_2_gc = (0x81<<0),  /* Prescaler, divide by 2 */
+    EVSYS_CHMUX_PRESCALER_4_gc = (0x82<<0),  /* Prescaler, divide by 4 */
+    EVSYS_CHMUX_PRESCALER_8_gc = (0x83<<0),  /* Prescaler, divide by 8 */
+    EVSYS_CHMUX_PRESCALER_16_gc = (0x84<<0),  /* Prescaler, divide by 16 */
+    EVSYS_CHMUX_PRESCALER_32_gc = (0x85<<0),  /* Prescaler, divide by 32 */
+    EVSYS_CHMUX_PRESCALER_64_gc = (0x86<<0),  /* Prescaler, divide by 64 */
+    EVSYS_CHMUX_PRESCALER_128_gc = (0x87<<0),  /* Prescaler, divide by 128 */
+    EVSYS_CHMUX_PRESCALER_256_gc = (0x88<<0),  /* Prescaler, divide by 256 */
+    EVSYS_CHMUX_PRESCALER_512_gc = (0x89<<0),  /* Prescaler, divide by 512 */
+    EVSYS_CHMUX_PRESCALER_1024_gc = (0x8A<<0),  /* Prescaler, divide by 1024 */
+    EVSYS_CHMUX_PRESCALER_2048_gc = (0x8B<<0),  /* Prescaler, divide by 2048 */
+    EVSYS_CHMUX_PRESCALER_4096_gc = (0x8C<<0),  /* Prescaler, divide by 4096 */
+    EVSYS_CHMUX_PRESCALER_8192_gc = (0x8D<<0),  /* Prescaler, divide by 8192 */
+    EVSYS_CHMUX_PRESCALER_16384_gc = (0x8E<<0),  /* Prescaler, divide by 16384 */
+    EVSYS_CHMUX_PRESCALER_32768_gc = (0x8F<<0),  /* Prescaler, divide by 32768 */
+    EVSYS_CHMUX_TCC0_OVF_gc = (0xC0<<0),  /* Timer/Counter C0 Overflow */
+    EVSYS_CHMUX_TCC0_ERR_gc = (0xC1<<0),  /* Timer/Counter C0 Error */
+    EVSYS_CHMUX_TCC0_CCA_gc = (0xC4<<0),  /* Timer/Counter C0 Compare or Capture A */
+    EVSYS_CHMUX_TCC0_CCB_gc = (0xC5<<0),  /* Timer/Counter C0 Compare or Capture B */
+    EVSYS_CHMUX_TCC0_CCC_gc = (0xC6<<0),  /* Timer/Counter C0 Compare or Capture C */
+    EVSYS_CHMUX_TCC0_CCD_gc = (0xC7<<0),  /* Timer/Counter C0 Compare or Capture D */
+    EVSYS_CHMUX_TCC1_OVF_gc = (0xC8<<0),  /* Timer/Counter C1 Overflow */
+    EVSYS_CHMUX_TCC1_ERR_gc = (0xC9<<0),  /* Timer/Counter C1 Error */
+    EVSYS_CHMUX_TCC1_CCA_gc = (0xCC<<0),  /* Timer/Counter C1 Compare or Capture A */
+    EVSYS_CHMUX_TCC1_CCB_gc = (0xCD<<0),  /* Timer/Counter C1 Compare or Capture B */
+    EVSYS_CHMUX_TCD0_OVF_gc = (0xD0<<0),  /* Timer/Counter D0 Overflow */
+    EVSYS_CHMUX_TCD0_ERR_gc = (0xD1<<0),  /* Timer/Counter D0 Error */
+    EVSYS_CHMUX_TCD0_CCA_gc = (0xD4<<0),  /* Timer/Counter D0 Compare or Capture A */
+    EVSYS_CHMUX_TCD0_CCB_gc = (0xD5<<0),  /* Timer/Counter D0 Compare or Capture B */
+    EVSYS_CHMUX_TCD0_CCC_gc = (0xD6<<0),  /* Timer/Counter D0 Compare or Capture C */
+    EVSYS_CHMUX_TCD0_CCD_gc = (0xD7<<0),  /* Timer/Counter D0 Compare or Capture D */
+    EVSYS_CHMUX_TCD1_OVF_gc = (0xD8<<0),  /* Timer/Counter D1 Overflow */
+    EVSYS_CHMUX_TCD1_ERR_gc = (0xD9<<0),  /* Timer/Counter D1 Error */
+    EVSYS_CHMUX_TCD1_CCA_gc = (0xDC<<0),  /* Timer/Counter D1 Compare or Capture A */
+    EVSYS_CHMUX_TCD1_CCB_gc = (0xDD<<0),  /* Timer/Counter D1 Compare or Capture B */
+    EVSYS_CHMUX_TCE0_OVF_gc = (0xE0<<0),  /* Timer/Counter E0 Overflow */
+    EVSYS_CHMUX_TCE0_ERR_gc = (0xE1<<0),  /* Timer/Counter E0 Error */
+    EVSYS_CHMUX_TCE0_CCA_gc = (0xE4<<0),  /* Timer/Counter E0 Compare or Capture A */
+    EVSYS_CHMUX_TCE0_CCB_gc = (0xE5<<0),  /* Timer/Counter E0 Compare or Capture B */
+    EVSYS_CHMUX_TCE0_CCC_gc = (0xE6<<0),  /* Timer/Counter E0 Compare or Capture C */
+    EVSYS_CHMUX_TCE0_CCD_gc = (0xE7<<0),  /* Timer/Counter E0 Compare or Capture D */
+    EVSYS_CHMUX_TCE1_OVF_gc = (0xE8<<0),  /* Timer/Counter E1 Overflow */
+    EVSYS_CHMUX_TCE1_ERR_gc = (0xE9<<0),  /* Timer/Counter E1 Error */
+    EVSYS_CHMUX_TCE1_CCA_gc = (0xEC<<0),  /* Timer/Counter E1 Compare or Capture A */
+    EVSYS_CHMUX_TCE1_CCB_gc = (0xED<<0),  /* Timer/Counter E1 Compare or Capture B */
+    EVSYS_CHMUX_TCF0_OVF_gc = (0xF0<<0),  /* Timer/Counter F0 Overflow */
+    EVSYS_CHMUX_TCF0_ERR_gc = (0xF1<<0),  /* Timer/Counter F0 Error */
+    EVSYS_CHMUX_TCF0_CCA_gc = (0xF4<<0),  /* Timer/Counter F0 Compare or Capture A */
+    EVSYS_CHMUX_TCF0_CCB_gc = (0xF5<<0),  /* Timer/Counter F0 Compare or Capture B */
+    EVSYS_CHMUX_TCF0_CCC_gc = (0xF6<<0),  /* Timer/Counter F0 Compare or Capture C */
+    EVSYS_CHMUX_TCF0_CCD_gc = (0xF7<<0),  /* Timer/Counter F0 Compare or Capture D */
+    EVSYS_CHMUX_TCF1_OVF_gc = (0xF8<<0),  /* Timer/Counter F1 Overflow */
+    EVSYS_CHMUX_TCF1_ERR_gc = (0xF9<<0),  /* Timer/Counter F1 Error */
+    EVSYS_CHMUX_TCF1_CCA_gc = (0xFC<<0),  /* Timer/Counter F1 Compare or Capture A */
+    EVSYS_CHMUX_TCF1_CCB_gc = (0xFD<<0),  /* Timer/Counter F1 Compare or Capture B */
+} EVSYS_CHMUX_t;
+
+
+/*
+--------------------------------------------------------------------------
+NVM - Non Volatile Memory Controller
+--------------------------------------------------------------------------
+*/
+
+/* Non-volatile Memory Controller */
+typedef struct NVM_struct
+{
+    register8_t ADDR0;  /* Address Register 0 */
+    register8_t ADDR1;  /* Address Register 1 */
+    register8_t ADDR2;  /* Address Register 2 */
+    register8_t reserved_0x03;
+    register8_t DATA0;  /* Data Register 0 */
+    register8_t DATA1;  /* Data Register 1 */
+    register8_t DATA2;  /* Data Register 2 */
+    register8_t reserved_0x07;
+    register8_t reserved_0x08;
+    register8_t reserved_0x09;
+    register8_t CMD;  /* Command */
+    register8_t CTRLA;  /* Control Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t INTCTRL;  /* Interrupt Control */
+    register8_t reserved_0x0E;
+    register8_t STATUS;  /* Status */
+    register8_t LOCK_BITS;  /* Lock Bits (Changed from LOCKBITS to avoid avr-libc collision) */
+} NVM_t;
+
+/* NVM Command */
+typedef enum NVM_CMD_enum
+{
+    NVM_CMD_NO_OPERATION_gc = (0x00<<0),  /* Noop/Ordinary LPM */
+    NVM_CMD_READ_USER_SIG_ROW_gc = (0x01<<0),  /* Read user signature row */
+    NVM_CMD_READ_CALIB_ROW_gc = (0x02<<0),  /* Read calibration row */
+    NVM_CMD_READ_EEPROM_gc = (0x06<<0),  /* Read EEPROM */
+    NVM_CMD_READ_FUSES_gc = (0x07<<0),  /* Read fuse byte */
+    NVM_CMD_WRITE_LOCK_BITS_gc = (0x08<<0),  /* Write lock bits */
+    NVM_CMD_ERASE_USER_SIG_ROW_gc = (0x18<<0),  /* Erase user signature row */
+    NVM_CMD_WRITE_USER_SIG_ROW_gc = (0x1A<<0),  /* Write user signature row */
+    NVM_CMD_ERASE_APP_gc = (0x20<<0),  /* Erase Application Section */
+    NVM_CMD_ERASE_APP_PAGE_gc = (0x22<<0),  /* Erase Application Section page */
+    NVM_CMD_LOAD_FLASH_BUFFER_gc = (0x23<<0),  /* Load Flash page buffer */
+    NVM_CMD_WRITE_APP_PAGE_gc = (0x24<<0),  /* Write Application Section page */
+    NVM_CMD_ERASE_WRITE_APP_PAGE_gc = (0x25<<0),  /* Erase-and-write Application Section page */
+    NVM_CMD_ERASE_FLASH_BUFFER_gc = (0x26<<0),  /* Erase/flush Flash page buffer */
+    NVM_CMD_ERASE_BOOT_PAGE_gc = (0x2A<<0),  /* Erase Boot Section page */
+    NVM_CMD_ERASE_FLASH_PAGE_gc = (0x2B<<0),  /* Erase Flash Page */
+    NVM_CMD_WRITE_BOOT_PAGE_gc = (0x2C<<0),  /* Write Boot Section page */
+    NVM_CMD_ERASE_WRITE_BOOT_PAGE_gc = (0x2D<<0),  /* Erase-and-write Boot Section page */
+    NVM_CMD_WRITE_FLASH_PAGE_gc = (0x2E<<0),  /* Write Flash Page */
+    NVM_CMD_ERASE_WRITE_FLASH_PAGE_gc = (0x2F<<0),  /* Erase-and-write Flash Page */
+    NVM_CMD_ERASE_EEPROM_gc = (0x30<<0),  /* Erase EEPROM */
+    NVM_CMD_ERASE_EEPROM_PAGE_gc = (0x32<<0),  /* Erase EEPROM page */
+    NVM_CMD_LOAD_EEPROM_BUFFER_gc = (0x33<<0),  /* Load EEPROM page buffer */
+    NVM_CMD_WRITE_EEPROM_PAGE_gc = (0x34<<0),  /* Write EEPROM page */
+    NVM_CMD_ERASE_WRITE_EEPROM_PAGE_gc = (0x35<<0),  /* Erase-and-write EEPROM page */
+    NVM_CMD_ERASE_EEPROM_BUFFER_gc = (0x36<<0),  /* Erase/flush EEPROM page buffer */
+    NVM_CMD_APP_CRC_gc = (0x38<<0),  /* Application section CRC */
+    NVM_CMD_BOOT_CRC_gc = (0x39<<0),  /*  Boot Section CRC */
+    NVM_CMD_FLASH_RANGE_CRC_gc = (0x3A<<0),  /* Flash Range CRC */
+    NVM_CMD_CHIP_ERASE_gc = (0x40<<0),  /* Erase Chip */
+    NVM_CMD_READ_NVM_gc = (0x43<<0),  /* Read NVM */
+    NVM_CMD_WRITE_FUSE_gc = (0x4C<<0),  /* Write Fuse byte */
+    NVM_CMD_ERASE_BOOT_gc = (0x68<<0),  /* Erase Boot Section */
+    NVM_CMD_FLASH_CRC_gc = (0x78<<0),  /* Flash CRC */
+} NVM_CMD_t;
+
+/* SPM ready interrupt level */
+typedef enum NVM_SPMLVL_enum
+{
+    NVM_SPMLVL_OFF_gc = (0x00<<2),  /* Interrupt disabled */
+    NVM_SPMLVL_LO_gc = (0x01<<2),  /* Low level */
+    NVM_SPMLVL_MED_gc = (0x02<<2),  /* Medium level */
+    NVM_SPMLVL_HI_gc = (0x03<<2),  /* High level */
+} NVM_SPMLVL_t;
+
+/* EEPROM ready interrupt level */
+typedef enum NVM_EELVL_enum
+{
+    NVM_EELVL_OFF_gc = (0x00<<0),  /* Interrupt disabled */
+    NVM_EELVL_LO_gc = (0x01<<0),  /* Low level */
+    NVM_EELVL_MED_gc = (0x02<<0),  /* Medium level */
+    NVM_EELVL_HI_gc = (0x03<<0),  /* High level */
+} NVM_EELVL_t;
+
+/* Boot lock bits - boot setcion */
+typedef enum NVM_BLBB_enum
+{
+    NVM_BLBB_RWLOCK_gc = (0x00<<6),  /* Read and write not allowed */
+    NVM_BLBB_RLOCK_gc = (0x01<<6),  /* Read not allowed */
+    NVM_BLBB_WLOCK_gc = (0x02<<6),  /* Write not allowed */
+    NVM_BLBB_NOLOCK_gc = (0x03<<6),  /* No locks */
+} NVM_BLBB_t;
+
+/* Boot lock bits - application section */
+typedef enum NVM_BLBA_enum
+{
+    NVM_BLBA_RWLOCK_gc = (0x00<<4),  /* Read and write not allowed */
+    NVM_BLBA_RLOCK_gc = (0x01<<4),  /* Read not allowed */
+    NVM_BLBA_WLOCK_gc = (0x02<<4),  /* Write not allowed */
+    NVM_BLBA_NOLOCK_gc = (0x03<<4),  /* No locks */
+} NVM_BLBA_t;
+
+/* Boot lock bits - application table section */
+typedef enum NVM_BLBAT_enum
+{
+    NVM_BLBAT_RWLOCK_gc = (0x00<<2),  /* Read and write not allowed */
+    NVM_BLBAT_RLOCK_gc = (0x01<<2),  /* Read not allowed */
+    NVM_BLBAT_WLOCK_gc = (0x02<<2),  /* Write not allowed */
+    NVM_BLBAT_NOLOCK_gc = (0x03<<2),  /* No locks */
+} NVM_BLBAT_t;
+
+/* Lock bits */
+typedef enum NVM_LB_enum
+{
+    NVM_LB_RWLOCK_gc = (0x00<<0),  /* Read and write not allowed */
+    NVM_LB_WLOCK_gc = (0x02<<0),  /* Write not allowed */
+    NVM_LB_NOLOCK_gc = (0x03<<0),  /* No locks */
+} NVM_LB_t;
+
+
+/*
+--------------------------------------------------------------------------
+AC - Analog Comparator
+--------------------------------------------------------------------------
+*/
+
+/* Analog Comparator */
+typedef struct AC_struct
+{
+    register8_t AC0CTRL;  /* Analog Comparator 0 Control */
+    register8_t AC1CTRL;  /* Analog Comparator 1 Control */
+    register8_t AC0MUXCTRL;  /* Analog Comparator 0 MUX Control */
+    register8_t AC1MUXCTRL;  /* Analog Comparator 1 MUX Control */
+    register8_t CTRLA;  /* Control Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t WINCTRL;  /* Window Mode Control */
+    register8_t STATUS;  /* Status */
+} AC_t;
+
+/* Interrupt mode */
+typedef enum AC_INTMODE_enum
+{
+    AC_INTMODE_BOTHEDGES_gc = (0x00<<6),  /* Interrupt on both edges */
+    AC_INTMODE_FALLING_gc = (0x02<<6),  /* Interrupt on falling edge */
+    AC_INTMODE_RISING_gc = (0x03<<6),  /* Interrupt on rising edge */
+} AC_INTMODE_t;
+
+/* Interrupt level */
+typedef enum AC_INTLVL_enum
+{
+    AC_INTLVL_OFF_gc = (0x00<<4),  /* Interrupt disabled */
+    AC_INTLVL_LO_gc = (0x01<<4),  /* Low level */
+    AC_INTLVL_MED_gc = (0x02<<4),  /* Medium level */
+    AC_INTLVL_HI_gc = (0x03<<4),  /* High level */
+} AC_INTLVL_t;
+
+/* Hysteresis mode selection */
+typedef enum AC_HYSMODE_enum
+{
+    AC_HYSMODE_NO_gc = (0x00<<1),  /* No hysteresis */
+    AC_HYSMODE_SMALL_gc = (0x01<<1),  /* Small hysteresis */
+    AC_HYSMODE_LARGE_gc = (0x02<<1),  /* Large hysteresis */
+} AC_HYSMODE_t;
+
+/* Positive input multiplexer selection */
+typedef enum AC_MUXPOS_enum
+{
+    AC_MUXPOS_PIN0_gc = (0x00<<3),  /* Pin 0 */
+    AC_MUXPOS_PIN1_gc = (0x01<<3),  /* Pin 1 */
+    AC_MUXPOS_PIN2_gc = (0x02<<3),  /* Pin 2 */
+    AC_MUXPOS_PIN3_gc = (0x03<<3),  /* Pin 3 */
+    AC_MUXPOS_PIN4_gc = (0x04<<3),  /* Pin 4 */
+    AC_MUXPOS_PIN5_gc = (0x05<<3),  /* Pin 5 */
+    AC_MUXPOS_PIN6_gc = (0x06<<3),  /* Pin 6 */
+    AC_MUXPOS_DAC_gc = (0x07<<3),  /* DAC output */
+} AC_MUXPOS_t;
+
+/* Negative input multiplexer selection */
+typedef enum AC_MUXNEG_enum
+{
+    AC_MUXNEG_PIN0_gc = (0x00<<0),  /* Pin 0 */
+    AC_MUXNEG_PIN1_gc = (0x01<<0),  /* Pin 1 */
+    AC_MUXNEG_PIN3_gc = (0x02<<0),  /* Pin 3 */
+    AC_MUXNEG_PIN5_gc = (0x03<<0),  /* Pin 5 */
+    AC_MUXNEG_PIN7_gc = (0x04<<0),  /* Pin 7 */
+    AC_MUXNEG_DAC_gc = (0x05<<0),  /* DAC output */
+    AC_MUXNEG_BANDGAP_gc = (0x06<<0),  /* Bandgap Reference */
+    AC_MUXNEG_SCALER_gc = (0x07<<0),  /* Internal voltage scaler */
+} AC_MUXNEG_t;
+
+/* Windows interrupt mode */
+typedef enum AC_WINTMODE_enum
+{
+    AC_WINTMODE_ABOVE_gc = (0x00<<2),  /* Interrupt on above window */
+    AC_WINTMODE_INSIDE_gc = (0x01<<2),  /* Interrupt on inside window */
+    AC_WINTMODE_BELOW_gc = (0x02<<2),  /* Interrupt on below window */
+    AC_WINTMODE_OUTSIDE_gc = (0x03<<2),  /* Interrupt on outside window */
+} AC_WINTMODE_t;
+
+/* Window interrupt level */
+typedef enum AC_WINTLVL_enum
+{
+    AC_WINTLVL_OFF_gc = (0x00<<0),  /* Interrupt disabled */
+    AC_WINTLVL_LO_gc = (0x01<<0),  /* Low priority */
+    AC_WINTLVL_MED_gc = (0x02<<0),  /* Medium priority */
+    AC_WINTLVL_HI_gc = (0x03<<0),  /* High priority */
+} AC_WINTLVL_t;
+
+/* Window mode state */
+typedef enum AC_WSTATE_enum
+{
+    AC_WSTATE_ABOVE_gc = (0x00<<6),  /* Signal above window */
+    AC_WSTATE_INSIDE_gc = (0x01<<6),  /* Signal inside window */
+    AC_WSTATE_BELOW_gc = (0x02<<6),  /* Signal below window */
+} AC_WSTATE_t;
+
+
+/*
+--------------------------------------------------------------------------
+ADC - Analog/Digital Converter
+--------------------------------------------------------------------------
+*/
+
+/* ADC Channel */
+typedef struct ADC_CH_struct
+{
+    register8_t CTRL;  /* Control Register */
+    register8_t MUXCTRL;  /* MUX Control */
+    register8_t INTCTRL;  /* Channel Interrupt Control Register */
+    register8_t INTFLAGS;  /* Interrupt Flags */
+    _WORDREGISTER(RES);  /* Channel Result */
+    register8_t SCAN;  /* Input Channel Scan */
+    register8_t reserved_0x07;
+} ADC_CH_t;
+
+
+/* Analog-to-Digital Converter */
+typedef struct ADC_struct
+{
+    register8_t CTRLA;  /* Control Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t REFCTRL;  /* Reference Control */
+    register8_t EVCTRL;  /* Event Control */
+    register8_t PRESCALER;  /* Clock Prescaler */
+    register8_t reserved_0x05;
+    register8_t INTFLAGS;  /* Interrupt Flags */
+    register8_t TEMP;  /* Temporary Register */
+    register8_t reserved_0x08;
+    register8_t reserved_0x09;
+    register8_t reserved_0x0A;
+    register8_t reserved_0x0B;
+    _WORDREGISTER(CAL);  /* Calibration Value */
+    register8_t reserved_0x0E;
+    register8_t reserved_0x0F;
+    _WORDREGISTER(CH0RES);  /* Channel 0 Result */
+    _WORDREGISTER(CH1RES);  /* Channel 1 Result */
+    _WORDREGISTER(CH2RES);  /* Channel 2 Result */
+    _WORDREGISTER(CH3RES);  /* Channel 3 Result */
+    _WORDREGISTER(CMP);  /* Compare Value */
+    register8_t reserved_0x1A;
+    register8_t reserved_0x1B;
+    register8_t reserved_0x1C;
+    register8_t reserved_0x1D;
+    register8_t reserved_0x1E;
+    register8_t reserved_0x1F;
+    ADC_CH_t CH0;  /* ADC Channel 0 */
+    ADC_CH_t CH1;  /* ADC Channel 1 */
+    ADC_CH_t CH2;  /* ADC Channel 2 */
+    ADC_CH_t CH3;  /* ADC Channel 3 */
+} ADC_t;
+
+/* Positive input multiplexer selection */
+typedef enum ADC_CH_MUXPOS_enum
+{
+    ADC_CH_MUXPOS_PIN0_gc = (0x00<<3),  /* Input pin 0 */
+    ADC_CH_MUXPOS_PIN1_gc = (0x01<<3),  /* Input pin 1 */
+    ADC_CH_MUXPOS_PIN2_gc = (0x02<<3),  /* Input pin 2 */
+    ADC_CH_MUXPOS_PIN3_gc = (0x03<<3),  /* Input pin 3 */
+    ADC_CH_MUXPOS_PIN4_gc = (0x04<<3),  /* Input pin 4 */
+    ADC_CH_MUXPOS_PIN5_gc = (0x05<<3),  /* Input pin 5 */
+    ADC_CH_MUXPOS_PIN6_gc = (0x06<<3),  /* Input pin 6 */
+    ADC_CH_MUXPOS_PIN7_gc = (0x07<<3),  /* Input pin 7 */
+    ADC_CH_MUXPOS_PIN8_gc = (0x08<<3),  /* Input pin 8 */
+    ADC_CH_MUXPOS_PIN9_gc = (0x09<<3),  /* Input pin 9 */
+    ADC_CH_MUXPOS_PIN10_gc = (0x0A<<3),  /* Input pin 10 */
+    ADC_CH_MUXPOS_PIN11_gc = (0x0B<<3),  /* Input pin 11 */
+    ADC_CH_MUXPOS_PIN12_gc = (0x0C<<3),  /* Input pin 12 */
+    ADC_CH_MUXPOS_PIN13_gc = (0x0D<<3),  /* Input pin 13 */
+    ADC_CH_MUXPOS_PIN14_gc = (0x0E<<3),  /* Input pin 14 */
+    ADC_CH_MUXPOS_PIN15_gc = (0x0F<<3),  /* Input pin 15 */
+} ADC_CH_MUXPOS_t;
+
+/* Internal input multiplexer selections */
+typedef enum ADC_CH_MUXINT_enum
+{
+    ADC_CH_MUXINT_TEMP_gc = (0x00<<3),  /* Temperature Reference */
+    ADC_CH_MUXINT_BANDGAP_gc = (0x01<<3),  /* Bandgap Reference */
+    ADC_CH_MUXINT_SCALEDVCC_gc = (0x02<<3),  /* 1/10 scaled VCC */
+    ADC_CH_MUXINT_DAC_gc = (0x03<<3),  /* DAC output */
+} ADC_CH_MUXINT_t;
+
+/* Negative input multiplexer selection */
+typedef enum ADC_CH_MUXNEG_enum
+{
+    ADC_CH_MUXNEG_PIN0_gc = (0x00<<0),  /* Input pin 0 (Input Mode = 2) */
+    ADC_CH_MUXNEG_PIN1_gc = (0x01<<0),  /* Input pin 1 (Input Mode = 2) */
+    ADC_CH_MUXNEG_PIN2_gc = (0x02<<0),  /* Input pin 2 (Input Mode = 2) */
+    ADC_CH_MUXNEG_PIN3_gc = (0x03<<0),  /* Input pin 3 (Input Mode = 2) */
+    ADC_CH_MUXNEG_PIN4_gc = (0x00<<0),  /* Input pin 4 (Input Mode = 3) */
+    ADC_CH_MUXNEG_PIN5_gc = (0x01<<0),  /* Input pin 5 (Input Mode = 3) */
+    ADC_CH_MUXNEG_PIN6_gc = (0x02<<0),  /* Input pin 6 (Input Mode = 3) */
+    ADC_CH_MUXNEG_PIN7_gc = (0x03<<0),  /* Input pin 7 (Input Mode = 3) */
+    ADC_CH_MUXNEG_GND_MODE3_gc = (0x05<<0),  /* PAD Ground (Input Mode = 2) */
+    ADC_CH_MUXNEG_INTGND_MODE3_gc = (0x07<<0),  /* Internal Ground (Input Mode = 2) */
+    ADC_CH_MUXNEG_INTGND_MODE4_gc = (0x04<<0),  /* Internal Ground (Input Mode = 3) */
+    ADC_CH_MUXNEG_GND_MODE4_gc = (0x07<<0),  /* PAD Ground (Input Mode = 3) */
+} ADC_CH_MUXNEG_t;
+
+/* Input mode */
+typedef enum ADC_CH_INPUTMODE_enum
+{
+    ADC_CH_INPUTMODE_INTERNAL_gc = (0x00<<0),  /* Internal inputs, no gain */
+    ADC_CH_INPUTMODE_SINGLEENDED_gc = (0x01<<0),  /* Single-ended input, no gain */
+    ADC_CH_INPUTMODE_DIFF_gc = (0x02<<0),  /* Differential input, no gain */
+    ADC_CH_INPUTMODE_DIFFWGAIN_gc = (0x03<<0),  /* Differential input, with gain */
+} ADC_CH_INPUTMODE_t;
+
+/* Gain factor */
+typedef enum ADC_CH_GAIN_enum
+{
+    ADC_CH_GAIN_1X_gc = (0x00<<2),  /* 1x gain */
+    ADC_CH_GAIN_2X_gc = (0x01<<2),  /* 2x gain */
+    ADC_CH_GAIN_4X_gc = (0x02<<2),  /* 4x gain */
+    ADC_CH_GAIN_8X_gc = (0x03<<2),  /* 8x gain */
+    ADC_CH_GAIN_16X_gc = (0x04<<2),  /* 16x gain */
+    ADC_CH_GAIN_32X_gc = (0x05<<2),  /* 32x gain */
+    ADC_CH_GAIN_64X_gc = (0x06<<2),  /* 64x gain */
+    ADC_CH_GAIN_DIV2_gc = (0x07<<2),  /* x/2 gain */
+} ADC_CH_GAIN_t;
+
+/* Conversion result resolution */
+typedef enum ADC_RESOLUTION_enum
+{
+    ADC_RESOLUTION_12BIT_gc = (0x00<<1),  /* 12-bit right-adjusted result */
+    ADC_RESOLUTION_8BIT_gc = (0x02<<1),  /* 8-bit right-adjusted result */
+    ADC_RESOLUTION_LEFT12BIT_gc = (0x03<<1),  /* 12-bit left-adjusted result */
+} ADC_RESOLUTION_t;
+
+/* Current Limitation Mode */
+typedef enum ADC_CURRLIMIT_enum
+{
+    ADC_CURRLIMIT_NO_gc = (0x00<<5),  /* No limit */
+    ADC_CURRLIMIT_LOW_gc = (0x01<<5),  /* Low current limit, max. sampling rate 1.5MSPS */
+    ADC_CURRLIMIT_MED_gc = (0x02<<5),  /* Medium current limit, max. sampling rate 1MSPS */
+    ADC_CURRLIMIT_HIGH_gc = (0x03<<5),  /* High current limit, max. sampling rate 0.5MSPS */
+} ADC_CURRLIMIT_t;
+
+/* Voltage reference selection */
+typedef enum ADC_REFSEL_enum
+{
+    ADC_REFSEL_INT1V_gc = (0x00<<4),  /* Internal 1V */
+    ADC_REFSEL_INTVCC_gc = (0x01<<4),  /* Internal VCC / 1.6 */
+    ADC_REFSEL_AREFA_gc = (0x02<<4),  /* External reference on PORT A */
+    ADC_REFSEL_AREFB_gc = (0x03<<4),  /* External reference on PORT B */
+    ADC_REFSEL_INTVCC2_gc = (0x04<<4),  /* Internal VCC / 2 */
+} ADC_REFSEL_t;
+
+/* Channel sweep selection */
+typedef enum ADC_SWEEP_enum
+{
+    ADC_SWEEP_0_gc = (0x00<<6),  /* ADC Channel 0 */
+    ADC_SWEEP_01_gc = (0x01<<6),  /* ADC Channel 0,1 */
+    ADC_SWEEP_012_gc = (0x02<<6),  /* ADC Channel 0,1,2 */
+    ADC_SWEEP_0123_gc = (0x03<<6),  /* ADC Channel 0,1,2,3 */
+} ADC_SWEEP_t;
+
+/* Event channel input selection */
+typedef enum ADC_EVSEL_enum
+{
+    ADC_EVSEL_0123_gc = (0x00<<3),  /* Event Channel 0,1,2,3 */
+    ADC_EVSEL_1234_gc = (0x01<<3),  /* Event Channel 1,2,3,4 */
+    ADC_EVSEL_2345_gc = (0x02<<3),  /* Event Channel 2,3,4,5 */
+    ADC_EVSEL_3456_gc = (0x03<<3),  /* Event Channel 3,4,5,6 */
+    ADC_EVSEL_4567_gc = (0x04<<3),  /* Event Channel 4,5,6,7 */
+    ADC_EVSEL_567_gc = (0x05<<3),  /* Event Channel 5,6,7 */
+    ADC_EVSEL_67_gc = (0x06<<3),  /* Event Channel 6,7 */
+    ADC_EVSEL_7_gc = (0x07<<3),  /* Event Channel 7 */
+} ADC_EVSEL_t;
+
+/* Event action selection */
+typedef enum ADC_EVACT_enum
+{
+    ADC_EVACT_NONE_gc = (0x00<<0),  /* No event action */
+    ADC_EVACT_CH0_gc = (0x01<<0),  /* First event triggers channel 0 */
+    ADC_EVACT_CH01_gc = (0x02<<0),  /* First two events trigger channel 0,1 */
+    ADC_EVACT_CH012_gc = (0x03<<0),  /* First three events trigger channel 0,1,2 */
+    ADC_EVACT_CH0123_gc = (0x04<<0),  /* Events trigger channel 0,1,2,3 */
+    ADC_EVACT_SWEEP_gc = (0x05<<0),  /* First event triggers sweep */
+    ADC_EVACT_SYNCSWEEP_gc = (0x06<<0),  /* The ADC is flushed and restarted for accurate timing */
+} ADC_EVACT_t;
+
+/* Interupt mode */
+typedef enum ADC_CH_INTMODE_enum
+{
+    ADC_CH_INTMODE_COMPLETE_gc = (0x00<<2),  /* Interrupt on conversion complete */
+    ADC_CH_INTMODE_BELOW_gc = (0x01<<2),  /* Interrupt on result below compare value */
+    ADC_CH_INTMODE_ABOVE_gc = (0x03<<2),  /* Interrupt on result above compare value */
+} ADC_CH_INTMODE_t;
+
+/* Interrupt level */
+typedef enum ADC_CH_INTLVL_enum
+{
+    ADC_CH_INTLVL_OFF_gc = (0x00<<0),  /* Interrupt disabled */
+    ADC_CH_INTLVL_LO_gc = (0x01<<0),  /* Low level */
+    ADC_CH_INTLVL_MED_gc = (0x02<<0),  /* Medium level */
+    ADC_CH_INTLVL_HI_gc = (0x03<<0),  /* High level */
+} ADC_CH_INTLVL_t;
+
+/* DMA request selection */
+typedef enum ADC_DMASEL_enum
+{
+    ADC_DMASEL_OFF_gc = (0x00<<6),  /* Combined DMA request OFF */
+    ADC_DMASEL_CH01_gc = (0x01<<6),  /* ADC Channel 0 or 1 */
+    ADC_DMASEL_CH012_gc = (0x02<<6),  /* ADC Channel 0 or 1 or 2 */
+    ADC_DMASEL_CH0123_gc = (0x03<<6),  /* ADC Channel 0 or 1 or 2 or 3 */
+} ADC_DMASEL_t;
+
+/* Clock prescaler */
+typedef enum ADC_PRESCALER_enum
+{
+    ADC_PRESCALER_DIV4_gc = (0x00<<0),  /* Divide clock by 4 */
+    ADC_PRESCALER_DIV8_gc = (0x01<<0),  /* Divide clock by 8 */
+    ADC_PRESCALER_DIV16_gc = (0x02<<0),  /* Divide clock by 16 */
+    ADC_PRESCALER_DIV32_gc = (0x03<<0),  /* Divide clock by 32 */
+    ADC_PRESCALER_DIV64_gc = (0x04<<0),  /* Divide clock by 64 */
+    ADC_PRESCALER_DIV128_gc = (0x05<<0),  /* Divide clock by 128 */
+    ADC_PRESCALER_DIV256_gc = (0x06<<0),  /* Divide clock by 256 */
+    ADC_PRESCALER_DIV512_gc = (0x07<<0),  /* Divide clock by 512 */
+} ADC_PRESCALER_t;
+
+
+/*
+--------------------------------------------------------------------------
+DAC - Digital/Analog Converter
+--------------------------------------------------------------------------
+*/
+
+/* Digital-to-Analog Converter */
+typedef struct DAC_struct
+{
+    register8_t CTRLA;  /* Control Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t CTRLC;  /* Control Register C */
+    register8_t EVCTRL;  /* Event Input Control */
+    register8_t reserved_0x04;
+    register8_t STATUS;  /* Status */
+    register8_t reserved_0x06;
+    register8_t reserved_0x07;
+    register8_t CH0GAINCAL;  /* Gain Calibration */
+    register8_t CH0OFFSETCAL;  /* Offset Calibration */
+    register8_t CH1GAINCAL;  /* Gain Calibration */
+    register8_t CH1OFFSETCAL;  /* Offset Calibration */
+    register8_t reserved_0x0C;
+    register8_t reserved_0x0D;
+    register8_t reserved_0x0E;
+    register8_t reserved_0x0F;
+    register8_t reserved_0x10;
+    register8_t reserved_0x11;
+    register8_t reserved_0x12;
+    register8_t reserved_0x13;
+    register8_t reserved_0x14;
+    register8_t reserved_0x15;
+    register8_t reserved_0x16;
+    register8_t reserved_0x17;
+    _WORDREGISTER(CH0DATA);  /* Channel 0 Data */
+    _WORDREGISTER(CH1DATA);  /* Channel 1 Data */
+} DAC_t;
+
+/* Output channel selection */
+typedef enum DAC_CHSEL_enum
+{
+    DAC_CHSEL_SINGLE_gc = (0x00<<5),  /* Single channel operation (Channel 0 only) */
+    DAC_CHSEL_SINGLE1_gc = (0x01<<5),  /* Single channel operation (Channel 1 only) */
+    DAC_CHSEL_DUAL_gc = (0x02<<5),  /* Dual channel operation (Channel 0 and channel 1) */
+} DAC_CHSEL_t;
+
+/* Reference voltage selection */
+typedef enum DAC_REFSEL_enum
+{
+    DAC_REFSEL_INT1V_gc = (0x00<<3),  /* Internal 1V  */
+    DAC_REFSEL_AVCC_gc = (0x01<<3),  /* Analog supply voltage */
+    DAC_REFSEL_AREFA_gc = (0x02<<3),  /* External reference on AREF on PORTA */
+    DAC_REFSEL_AREFB_gc = (0x03<<3),  /* External reference on AREF on PORTB */
+} DAC_REFSEL_t;
+
+/* Event channel selection */
+typedef enum DAC_EVSEL_enum
+{
+    DAC_EVSEL_0_gc = (0x00<<0),  /* Event Channel 0 */
+    DAC_EVSEL_1_gc = (0x01<<0),  /* Event Channel 1 */
+    DAC_EVSEL_2_gc = (0x02<<0),  /* Event Channel 2 */
+    DAC_EVSEL_3_gc = (0x03<<0),  /* Event Channel 3 */
+    DAC_EVSEL_4_gc = (0x04<<0),  /* Event Channel 4 */
+    DAC_EVSEL_5_gc = (0x05<<0),  /* Event Channel 5 */
+    DAC_EVSEL_6_gc = (0x06<<0),  /* Event Channel 6 */
+    DAC_EVSEL_7_gc = (0x07<<0),  /* Event Channel 7 */
+} DAC_EVSEL_t;
+
+
+/*
+--------------------------------------------------------------------------
+RTC - Real-Time Counter
+--------------------------------------------------------------------------
+*/
+
+/* Real-Time Counter */
+typedef struct RTC_struct
+{
+    register8_t CTRL;  /* Control Register */
+    register8_t STATUS;  /* Status Register */
+    register8_t INTCTRL;  /* Interrupt Control Register */
+    register8_t INTFLAGS;  /* Interrupt Flags */
+    register8_t TEMP;  /* Temporary register */
+    register8_t reserved_0x05;
+    register8_t reserved_0x06;
+    register8_t reserved_0x07;
+    _WORDREGISTER(CNT);  /* Count Register */
+    _WORDREGISTER(PER);  /* Period Register */
+    _WORDREGISTER(COMP);  /* Compare Register */
+} RTC_t;
+
+/* Prescaler Factor */
+typedef enum RTC_PRESCALER_enum
+{
+    RTC_PRESCALER_OFF_gc = (0x00<<0),  /* RTC Off */
+    RTC_PRESCALER_DIV1_gc = (0x01<<0),  /* RTC Clock */
+    RTC_PRESCALER_DIV2_gc = (0x02<<0),  /* RTC Clock / 2 */
+    RTC_PRESCALER_DIV8_gc = (0x03<<0),  /* RTC Clock / 8 */
+    RTC_PRESCALER_DIV16_gc = (0x04<<0),  /* RTC Clock / 16 */
+    RTC_PRESCALER_DIV64_gc = (0x05<<0),  /* RTC Clock / 64 */
+    RTC_PRESCALER_DIV256_gc = (0x06<<0),  /* RTC Clock / 256 */
+    RTC_PRESCALER_DIV1024_gc = (0x07<<0),  /* RTC Clock / 1024 */
+} RTC_PRESCALER_t;
+
+/* Compare Interrupt level */
+typedef enum RTC_COMPINTLVL_enum
+{
+    RTC_COMPINTLVL_OFF_gc = (0x00<<2),  /* Interrupt Disabled */
+    RTC_COMPINTLVL_LO_gc = (0x01<<2),  /* Low Level */
+    RTC_COMPINTLVL_MED_gc = (0x02<<2),  /* Medium Level */
+    RTC_COMPINTLVL_HI_gc = (0x03<<2),  /* High Level */
+} RTC_COMPINTLVL_t;
+
+/* Overflow Interrupt level */
+typedef enum RTC_OVFINTLVL_enum
+{
+    RTC_OVFINTLVL_OFF_gc = (0x00<<0),  /* Interrupt Disabled */
+    RTC_OVFINTLVL_LO_gc = (0x01<<0),  /* Low Level */
+    RTC_OVFINTLVL_MED_gc = (0x02<<0),  /* Medium Level */
+    RTC_OVFINTLVL_HI_gc = (0x03<<0),  /* High Level */
+} RTC_OVFINTLVL_t;
+
+
+/*
+--------------------------------------------------------------------------
+TWI - Two-Wire Interface
+--------------------------------------------------------------------------
+*/
+
+/*  */
+typedef struct TWI_MASTER_struct
+{
+    register8_t CTRLA;  /* Control Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t CTRLC;  /* Control Register C */
+    register8_t STATUS;  /* Status Register */
+    register8_t BAUD;  /* Baurd Rate Control Register */
+    register8_t ADDR;  /* Address Register */
+    register8_t DATA;  /* Data Register */
+} TWI_MASTER_t;
+
+
+/*  */
+typedef struct TWI_SLAVE_struct
+{
+    register8_t CTRLA;  /* Control Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t STATUS;  /* Status Register */
+    register8_t ADDR;  /* Address Register */
+    register8_t DATA;  /* Data Register */
+    register8_t ADDRMASK;  /* Address Mask Register */
+} TWI_SLAVE_t;
+
+
+/* Two-Wire Interface */
+typedef struct TWI_struct
+{
+    register8_t CTRL;  /* TWI Common Control Register */
+    TWI_MASTER_t MASTER;  /* TWI master module */
+    TWI_SLAVE_t SLAVE;  /* TWI slave module */
+} TWI_t;
+
+/* SDA Hold Time */
+typedef enum TWI_SDAHOLD_enum
+{
+    TWI_SDAHOLD_OFF_gc = (0x00<<1),  /* SDA Hold Time off */
+    TWI_SDAHOLD_50NS_gc = (0x01<<1),  /* SDA Hold Time 50 ns */
+    TWI_SDAHOLD_300NS_gc = (0x02<<1),  /* SDA Hold Time 300 ns */
+    TWI_SDAHOLD_400NS_gc = (0x03<<1),  /* SDA Hold Time 400 ns */
+} TWI_SDAHOLD_t;
+
+/* Master Interrupt Level */
+typedef enum TWI_MASTER_INTLVL_enum
+{
+    TWI_MASTER_INTLVL_OFF_gc = (0x00<<6),  /* Interrupt Disabled */
+    TWI_MASTER_INTLVL_LO_gc = (0x01<<6),  /* Low Level */
+    TWI_MASTER_INTLVL_MED_gc = (0x02<<6),  /* Medium Level */
+    TWI_MASTER_INTLVL_HI_gc = (0x03<<6),  /* High Level */
+} TWI_MASTER_INTLVL_t;
+
+/* Inactive Timeout */
+typedef enum TWI_MASTER_TIMEOUT_enum
+{
+    TWI_MASTER_TIMEOUT_DISABLED_gc = (0x00<<2),  /* Bus Timeout Disabled */
+    TWI_MASTER_TIMEOUT_50US_gc = (0x01<<2),  /* 50 Microseconds */
+    TWI_MASTER_TIMEOUT_100US_gc = (0x02<<2),  /* 100 Microseconds */
+    TWI_MASTER_TIMEOUT_200US_gc = (0x03<<2),  /* 200 Microseconds */
+} TWI_MASTER_TIMEOUT_t;
+
+/* Master Command */
+typedef enum TWI_MASTER_CMD_enum
+{
+    TWI_MASTER_CMD_NOACT_gc = (0x00<<0),  /* No Action */
+    TWI_MASTER_CMD_REPSTART_gc = (0x01<<0),  /* Issue Repeated Start Condition */
+    TWI_MASTER_CMD_RECVTRANS_gc = (0x02<<0),  /* Receive or Transmit Data */
+    TWI_MASTER_CMD_STOP_gc = (0x03<<0),  /* Issue Stop Condition */
+} TWI_MASTER_CMD_t;
+
+/* Master Bus State */
+typedef enum TWI_MASTER_BUSSTATE_enum
+{
+    TWI_MASTER_BUSSTATE_UNKNOWN_gc = (0x00<<0),  /* Unknown Bus State */
+    TWI_MASTER_BUSSTATE_IDLE_gc = (0x01<<0),  /* Bus is Idle */
+    TWI_MASTER_BUSSTATE_OWNER_gc = (0x02<<0),  /* This Module Controls The Bus */
+    TWI_MASTER_BUSSTATE_BUSY_gc = (0x03<<0),  /* The Bus is Busy */
+} TWI_MASTER_BUSSTATE_t;
+
+/* Slave Interrupt Level */
+typedef enum TWI_SLAVE_INTLVL_enum
+{
+    TWI_SLAVE_INTLVL_OFF_gc = (0x00<<6),  /* Interrupt Disabled */
+    TWI_SLAVE_INTLVL_LO_gc = (0x01<<6),  /* Low Level */
+    TWI_SLAVE_INTLVL_MED_gc = (0x02<<6),  /* Medium Level */
+    TWI_SLAVE_INTLVL_HI_gc = (0x03<<6),  /* High Level */
+} TWI_SLAVE_INTLVL_t;
+
+/* Slave Command */
+typedef enum TWI_SLAVE_CMD_enum
+{
+    TWI_SLAVE_CMD_NOACT_gc = (0x00<<0),  /* No Action */
+    TWI_SLAVE_CMD_COMPTRANS_gc = (0x02<<0),  /* Used To Complete a Transaction */
+    TWI_SLAVE_CMD_RESPONSE_gc = (0x03<<0),  /* Used in Response to Address/Data Interrupt */
+} TWI_SLAVE_CMD_t;
+
+
+/*
+--------------------------------------------------------------------------
+USB - USB
+--------------------------------------------------------------------------
+*/
+
+/* USB Endpoint */
+typedef struct USB_EP_struct
+{
+    register8_t STATUS;  /* Endpoint Status */
+    register8_t CTRL;  /* Endpoint Control */
+    _WORDREGISTER(CNT);  /* USB Endpoint Counter */
+    _WORDREGISTER(DATAPTR);  /* Data Pointer */
+    _WORDREGISTER(AUXDATA);  /* Auxiliary Data */
+} USB_EP_t;
+
+
+/* Universal Serial Bus */
+typedef struct USB_struct
+{
+    register8_t CTRLA;  /* Control Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t STATUS;  /* Status Register */
+    register8_t ADDR;  /* Address Register */
+    register8_t FIFOWP;  /* FIFO Write Pointer Register */
+    register8_t FIFORP;  /* FIFO Read Pointer Register */
+    _WORDREGISTER(EPPTR);  /* Endpoint Configuration Table Pointer */
+    register8_t INTCTRLA;  /* Interrupt Control Register A */
+    register8_t INTCTRLB;  /* Interrupt Control Register B */
+    register8_t INTFLAGSACLR;  /* Clear Interrupt Flag Register A */
+    register8_t INTFLAGSASET;  /* Set Interrupt Flag Register A */
+    register8_t INTFLAGSBCLR;  /* Clear Interrupt Flag Register B */
+    register8_t INTFLAGSBSET;  /* Set Interrupt Flag Register B */
+    register8_t reserved_0x0E;
+    register8_t reserved_0x0F;
+    register8_t reserved_0x10;
+    register8_t reserved_0x11;
+    register8_t reserved_0x12;
+    register8_t reserved_0x13;
+    register8_t reserved_0x14;
+    register8_t reserved_0x15;
+    register8_t reserved_0x16;
+    register8_t reserved_0x17;
+    register8_t reserved_0x18;
+    register8_t reserved_0x19;
+    register8_t reserved_0x1A;
+    register8_t reserved_0x1B;
+    register8_t reserved_0x1C;
+    register8_t reserved_0x1D;
+    register8_t reserved_0x1E;
+    register8_t reserved_0x1F;
+    register8_t reserved_0x20;
+    register8_t reserved_0x21;
+    register8_t reserved_0x22;
+    register8_t reserved_0x23;
+    register8_t reserved_0x24;
+    register8_t reserved_0x25;
+    register8_t reserved_0x26;
+    register8_t reserved_0x27;
+    register8_t reserved_0x28;
+    register8_t reserved_0x29;
+    register8_t reserved_0x2A;
+    register8_t reserved_0x2B;
+    register8_t reserved_0x2C;
+    register8_t reserved_0x2D;
+    register8_t reserved_0x2E;
+    register8_t reserved_0x2F;
+    register8_t reserved_0x30;
+    register8_t reserved_0x31;
+    register8_t reserved_0x32;
+    register8_t reserved_0x33;
+    register8_t reserved_0x34;
+    register8_t reserved_0x35;
+    register8_t reserved_0x36;
+    register8_t reserved_0x37;
+    register8_t reserved_0x38;
+    register8_t reserved_0x39;
+    register8_t CAL0;  /* Calibration Byte 0 */
+    register8_t CAL1;  /* Calibration Byte 1 */
+} USB_t;
+
+
+/* USB Endpoint Table */
+typedef struct USB_EP_TABLE_struct
+{
+    USB_EP_t EP0OUT;  /* Endpoint 0 */
+    USB_EP_t EP0IN;  /* Endpoint 0 */
+    USB_EP_t EP1OUT;  /* Endpoint 1 */
+    USB_EP_t EP1IN;  /* Endpoint 1 */
+    USB_EP_t EP2OUT;  /* Endpoint 2 */
+    USB_EP_t EP2IN;  /* Endpoint 2 */
+    USB_EP_t EP3OUT;  /* Endpoint 3 */
+    USB_EP_t EP3IN;  /* Endpoint 3 */
+    USB_EP_t EP4OUT;  /* Endpoint 4 */
+    USB_EP_t EP4IN;  /* Endpoint 4 */
+    USB_EP_t EP5OUT;  /* Endpoint 5 */
+    USB_EP_t EP5IN;  /* Endpoint 5 */
+    USB_EP_t EP6OUT;  /* Endpoint 6 */
+    USB_EP_t EP6IN;  /* Endpoint 6 */
+    USB_EP_t EP7OUT;  /* Endpoint 7 */
+    USB_EP_t EP7IN;  /* Endpoint 7 */
+    USB_EP_t EP8OUT;  /* Endpoint 8 */
+    USB_EP_t EP8IN;  /* Endpoint 8 */
+    USB_EP_t EP9OUT;  /* Endpoint 9 */
+    USB_EP_t EP9IN;  /* Endpoint 9 */
+    USB_EP_t EP10OUT;  /* Endpoint 10 */
+    USB_EP_t EP10IN;  /* Endpoint 10 */
+    USB_EP_t EP11OUT;  /* Endpoint 11 */
+    USB_EP_t EP11IN;  /* Endpoint 11 */
+    USB_EP_t EP12OUT;  /* Endpoint 12 */
+    USB_EP_t EP12IN;  /* Endpoint 12 */
+    USB_EP_t EP13OUT;  /* Endpoint 13 */
+    USB_EP_t EP13IN;  /* Endpoint 13 */
+    USB_EP_t EP14OUT;  /* Endpoint 14 */
+    USB_EP_t EP14IN;  /* Endpoint 14 */
+    USB_EP_t EP15OUT;  /* Endpoint 15 */
+    USB_EP_t EP15IN;  /* Endpoint 15 */
+    register8_t reserved_0x100;
+    register8_t reserved_0x101;
+    register8_t reserved_0x102;
+    register8_t reserved_0x103;
+    register8_t reserved_0x104;
+    register8_t reserved_0x105;
+    register8_t reserved_0x106;
+    register8_t reserved_0x107;
+    register8_t reserved_0x108;
+    register8_t reserved_0x109;
+    register8_t reserved_0x10A;
+    register8_t reserved_0x10B;
+    register8_t reserved_0x10C;
+    register8_t reserved_0x10D;
+    register8_t reserved_0x10E;
+    register8_t reserved_0x10F;
+    register8_t FRAMENUML;  /* Frame Number Low Byte */
+    register8_t FRAMENUMH;  /* Frame Number High Byte */
+} USB_EP_TABLE_t;
+
+/* Interrupt level */
+typedef enum USB_INTLVL_enum
+{
+    USB_INTLVL_OFF_gc = (0x00<<0),  /* Interrupt disabled */
+    USB_INTLVL_LO_gc = (0x01<<0),  /* Low level */
+    USB_INTLVL_MED_gc = (0x02<<0),  /* Medium level */
+    USB_INTLVL_HI_gc = (0x03<<0),  /* High level */
+} USB_INTLVL_t;
+
+/* USB Endpoint Type */
+typedef enum USB_EP_TYPE_enum
+{
+    USB_EP_TYPE_DISABLE_gc = (0x00<<6),  /* Endpoint Disabled */
+    USB_EP_TYPE_CONTROL_gc = (0x01<<6),  /* Control */
+    USB_EP_TYPE_BULK_gc = (0x02<<6),  /* Bulk/Interrupt */
+    USB_EP_TYPE_ISOCHRONOUS_gc = (0x03<<6),  /* Isochronous */
+} USB_EP_TYPE_t;
+
+/* USB Endpoint Buffersize */
+typedef enum USB_EP_BUFSIZE_enum
+{
+    USB_EP_BUFSIZE_8_gc = (0x00<<0),  /* 8 bytes buffer size */
+    USB_EP_BUFSIZE_16_gc = (0x01<<0),  /* 16 bytes buffer size */
+    USB_EP_BUFSIZE_32_gc = (0x02<<0),  /* 32 bytes buffer size */
+    USB_EP_BUFSIZE_64_gc = (0x03<<0),  /* 64 bytes buffer size */
+    USB_EP_BUFSIZE_128_gc = (0x04<<0),  /* 128 bytes buffer size */
+    USB_EP_BUFSIZE_256_gc = (0x05<<0),  /* 256 bytes buffer size */
+    USB_EP_BUFSIZE_512_gc = (0x06<<0),  /* 512 bytes buffer size */
+    USB_EP_BUFSIZE_1023_gc = (0x07<<0),  /* 1023 bytes buffer size */
+} USB_EP_BUFSIZE_t;
+
+
+/*
+--------------------------------------------------------------------------
+PORT - I/O Port Configuration
+--------------------------------------------------------------------------
+*/
+
+/* I/O Ports */
+typedef struct PORT_struct
+{
+    register8_t DIR;  /* I/O Port Data Direction */
+    register8_t DIRSET;  /* I/O Port Data Direction Set */
+    register8_t DIRCLR;  /* I/O Port Data Direction Clear */
+    register8_t DIRTGL;  /* I/O Port Data Direction Toggle */
+    register8_t OUT;  /* I/O Port Output */
+    register8_t OUTSET;  /* I/O Port Output Set */
+    register8_t OUTCLR;  /* I/O Port Output Clear */
+    register8_t OUTTGL;  /* I/O Port Output Toggle */
+    register8_t IN;  /* I/O port Input */
+    register8_t INTCTRL;  /* Interrupt Control Register */
+    register8_t INT0MASK;  /* Port Interrupt 0 Mask */
+    register8_t INT1MASK;  /* Port Interrupt 1 Mask */
+    register8_t INTFLAGS;  /* Interrupt Flag Register */
+    register8_t reserved_0x0D;
+    register8_t REMAP;  /* I/O Port Pin Remap Register */
+    register8_t reserved_0x0F;
+    register8_t PIN0CTRL;  /* Pin 0 Control Register */
+    register8_t PIN1CTRL;  /* Pin 1 Control Register */
+    register8_t PIN2CTRL;  /* Pin 2 Control Register */
+    register8_t PIN3CTRL;  /* Pin 3 Control Register */
+    register8_t PIN4CTRL;  /* Pin 4 Control Register */
+    register8_t PIN5CTRL;  /* Pin 5 Control Register */
+    register8_t PIN6CTRL;  /* Pin 6 Control Register */
+    register8_t PIN7CTRL;  /* Pin 7 Control Register */
+} PORT_t;
+
+/* Port Interrupt 0 Level */
+typedef enum PORT_INT0LVL_enum
+{
+    PORT_INT0LVL_OFF_gc = (0x00<<0),  /* Interrupt Disabled */
+    PORT_INT0LVL_LO_gc = (0x01<<0),  /* Low Level */
+    PORT_INT0LVL_MED_gc = (0x02<<0),  /* Medium Level */
+    PORT_INT0LVL_HI_gc = (0x03<<0),  /* High Level */
+} PORT_INT0LVL_t;
+
+/* Port Interrupt 1 Level */
+typedef enum PORT_INT1LVL_enum
+{
+    PORT_INT1LVL_OFF_gc = (0x00<<2),  /* Interrupt Disabled */
+    PORT_INT1LVL_LO_gc = (0x01<<2),  /* Low Level */
+    PORT_INT1LVL_MED_gc = (0x02<<2),  /* Medium Level */
+    PORT_INT1LVL_HI_gc = (0x03<<2),  /* High Level */
+} PORT_INT1LVL_t;
+
+/* Output/Pull Configuration */
+typedef enum PORT_OPC_enum
+{
+    PORT_OPC_TOTEM_gc = (0x00<<3),  /* Totempole */
+    PORT_OPC_BUSKEEPER_gc = (0x01<<3),  /* Totempole w/ Bus keeper on Input and Output */
+    PORT_OPC_PULLDOWN_gc = (0x02<<3),  /* Totempole w/ Pull-down on Input */
+    PORT_OPC_PULLUP_gc = (0x03<<3),  /* Totempole w/ Pull-up on Input */
+    PORT_OPC_WIREDOR_gc = (0x04<<3),  /* Wired OR */
+    PORT_OPC_WIREDAND_gc = (0x05<<3),  /* Wired AND */
+    PORT_OPC_WIREDORPULL_gc = (0x06<<3),  /* Wired OR w/ Pull-down */
+    PORT_OPC_WIREDANDPULL_gc = (0x07<<3),  /* Wired AND w/ Pull-up */
+} PORT_OPC_t;
+
+/* Input/Sense Configuration */
+typedef enum PORT_ISC_enum
+{
+    PORT_ISC_BOTHEDGES_gc = (0x00<<0),  /* Sense Both Edges */
+    PORT_ISC_RISING_gc = (0x01<<0),  /* Sense Rising Edge */
+    PORT_ISC_FALLING_gc = (0x02<<0),  /* Sense Falling Edge */
+    PORT_ISC_LEVEL_gc = (0x03<<0),  /* Sense Level (Transparent For Events) */
+    PORT_ISC_INPUT_DISABLE_gc = (0x07<<0),  /* Disable Digital Input Buffer */
+} PORT_ISC_t;
+
+
+/*
+--------------------------------------------------------------------------
+TC - 16-bit Timer/Counter With PWM
+--------------------------------------------------------------------------
+*/
+
+/* 16-bit Timer/Counter 0 */
+typedef struct TC0_struct
+{
+    register8_t CTRLA;  /* Control  Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t CTRLC;  /* Control register C */
+    register8_t CTRLD;  /* Control Register D */
+    register8_t CTRLE;  /* Control Register E */
+    register8_t reserved_0x05;
+    register8_t INTCTRLA;  /* Interrupt Control Register A */
+    register8_t INTCTRLB;  /* Interrupt Control Register B */
+    register8_t CTRLFCLR;  /* Control Register F Clear */
+    register8_t CTRLFSET;  /* Control Register F Set */
+    register8_t CTRLGCLR;  /* Control Register G Clear */
+    register8_t CTRLGSET;  /* Control Register G Set */
+    register8_t INTFLAGS;  /* Interrupt Flag Register */
+    register8_t reserved_0x0D;
+    register8_t reserved_0x0E;
+    register8_t TEMP;  /* Temporary Register For 16-bit Access */
+    register8_t reserved_0x10;
+    register8_t reserved_0x11;
+    register8_t reserved_0x12;
+    register8_t reserved_0x13;
+    register8_t reserved_0x14;
+    register8_t reserved_0x15;
+    register8_t reserved_0x16;
+    register8_t reserved_0x17;
+    register8_t reserved_0x18;
+    register8_t reserved_0x19;
+    register8_t reserved_0x1A;
+    register8_t reserved_0x1B;
+    register8_t reserved_0x1C;
+    register8_t reserved_0x1D;
+    register8_t reserved_0x1E;
+    register8_t reserved_0x1F;
+    _WORDREGISTER(CNT);  /* Count */
+    register8_t reserved_0x22;
+    register8_t reserved_0x23;
+    register8_t reserved_0x24;
+    register8_t reserved_0x25;
+    _WORDREGISTER(PER);  /* Period */
+    _WORDREGISTER(CCA);  /* Compare or Capture A */
+    _WORDREGISTER(CCB);  /* Compare or Capture B */
+    _WORDREGISTER(CCC);  /* Compare or Capture C */
+    _WORDREGISTER(CCD);  /* Compare or Capture D */
+    register8_t reserved_0x30;
+    register8_t reserved_0x31;
+    register8_t reserved_0x32;
+    register8_t reserved_0x33;
+    register8_t reserved_0x34;
+    register8_t reserved_0x35;
+    _WORDREGISTER(PERBUF);  /* Period Buffer */
+    _WORDREGISTER(CCABUF);  /* Compare Or Capture A Buffer */
+    _WORDREGISTER(CCBBUF);  /* Compare Or Capture B Buffer */
+    _WORDREGISTER(CCCBUF);  /* Compare Or Capture C Buffer */
+    _WORDREGISTER(CCDBUF);  /* Compare Or Capture D Buffer */
+} TC0_t;
+
+
+/* 16-bit Timer/Counter 1 */
+typedef struct TC1_struct
+{
+    register8_t CTRLA;  /* Control  Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t CTRLC;  /* Control register C */
+    register8_t CTRLD;  /* Control Register D */
+    register8_t CTRLE;  /* Control Register E */
+    register8_t reserved_0x05;
+    register8_t INTCTRLA;  /* Interrupt Control Register A */
+    register8_t INTCTRLB;  /* Interrupt Control Register B */
+    register8_t CTRLFCLR;  /* Control Register F Clear */
+    register8_t CTRLFSET;  /* Control Register F Set */
+    register8_t CTRLGCLR;  /* Control Register G Clear */
+    register8_t CTRLGSET;  /* Control Register G Set */
+    register8_t INTFLAGS;  /* Interrupt Flag Register */
+    register8_t reserved_0x0D;
+    register8_t reserved_0x0E;
+    register8_t TEMP;  /* Temporary Register For 16-bit Access */
+    register8_t reserved_0x10;
+    register8_t reserved_0x11;
+    register8_t reserved_0x12;
+    register8_t reserved_0x13;
+    register8_t reserved_0x14;
+    register8_t reserved_0x15;
+    register8_t reserved_0x16;
+    register8_t reserved_0x17;
+    register8_t reserved_0x18;
+    register8_t reserved_0x19;
+    register8_t reserved_0x1A;
+    register8_t reserved_0x1B;
+    register8_t reserved_0x1C;
+    register8_t reserved_0x1D;
+    register8_t reserved_0x1E;
+    register8_t reserved_0x1F;
+    _WORDREGISTER(CNT);  /* Count */
+    register8_t reserved_0x22;
+    register8_t reserved_0x23;
+    register8_t reserved_0x24;
+    register8_t reserved_0x25;
+    _WORDREGISTER(PER);  /* Period */
+    _WORDREGISTER(CCA);  /* Compare or Capture A */
+    _WORDREGISTER(CCB);  /* Compare or Capture B */
+    register8_t reserved_0x2C;
+    register8_t reserved_0x2D;
+    register8_t reserved_0x2E;
+    register8_t reserved_0x2F;
+    register8_t reserved_0x30;
+    register8_t reserved_0x31;
+    register8_t reserved_0x32;
+    register8_t reserved_0x33;
+    register8_t reserved_0x34;
+    register8_t reserved_0x35;
+    _WORDREGISTER(PERBUF);  /* Period Buffer */
+    _WORDREGISTER(CCABUF);  /* Compare Or Capture A Buffer */
+    _WORDREGISTER(CCBBUF);  /* Compare Or Capture B Buffer */
+} TC1_t;
+
+/* Clock Selection */
+typedef enum TC_CLKSEL_enum
+{
+    TC_CLKSEL_OFF_gc = (0x00<<0),  /* Timer Off */
+    TC_CLKSEL_DIV1_gc = (0x01<<0),  /* System Clock */
+    TC_CLKSEL_DIV2_gc = (0x02<<0),  /* System Clock / 2 */
+    TC_CLKSEL_DIV4_gc = (0x03<<0),  /* System Clock / 4 */
+    TC_CLKSEL_DIV8_gc = (0x04<<0),  /* System Clock / 8 */
+    TC_CLKSEL_DIV64_gc = (0x05<<0),  /* System Clock / 64 */
+    TC_CLKSEL_DIV256_gc = (0x06<<0),  /* System Clock / 256 */
+    TC_CLKSEL_DIV1024_gc = (0x07<<0),  /* System Clock / 1024 */
+    TC_CLKSEL_EVCH0_gc = (0x08<<0),  /* Event Channel 0 */
+    TC_CLKSEL_EVCH1_gc = (0x09<<0),  /* Event Channel 1 */
+    TC_CLKSEL_EVCH2_gc = (0x0A<<0),  /* Event Channel 2 */
+    TC_CLKSEL_EVCH3_gc = (0x0B<<0),  /* Event Channel 3 */
+    TC_CLKSEL_EVCH4_gc = (0x0C<<0),  /* Event Channel 4 */
+    TC_CLKSEL_EVCH5_gc = (0x0D<<0),  /* Event Channel 5 */
+    TC_CLKSEL_EVCH6_gc = (0x0E<<0),  /* Event Channel 6 */
+    TC_CLKSEL_EVCH7_gc = (0x0F<<0),  /* Event Channel 7 */
+} TC_CLKSEL_t;
+
+/* Waveform Generation Mode */
+typedef enum TC_WGMODE_enum
+{
+    TC_WGMODE_NORMAL_gc = (0x00<<0),  /* Normal Mode */
+    TC_WGMODE_FRQ_gc = (0x01<<0),  /* Frequency Generation Mode */
+    TC_WGMODE_SINGLESLOPE_gc = (0x03<<0),  /* Single Slope */
+    TC_WGMODE_SS_gc = (0x03<<0),  /* Single Slope */
+    TC_WGMODE_DSTOP_gc = (0x05<<0),  /* Dual Slope, Update on TOP */
+    TC_WGMODE_DS_T_gc = (0x05<<0),  /* Dual Slope, Update on TOP */
+    TC_WGMODE_DSBOTH_gc = (0x06<<0),  /* Dual Slope, Update on both TOP and BOTTOM */
+    TC_WGMODE_DS_TB_gc = (0x06<<0),  /* Dual Slope, Update on both TOP and BOTTOM */
+    TC_WGMODE_DSBOTTOM_gc = (0x07<<0),  /* Dual Slope, Update on BOTTOM */
+    TC_WGMODE_DS_B_gc = (0x07<<0),  /* Dual Slope, Update on BOTTOM */
+} TC_WGMODE_t;
+
+/* Byte Mode */
+typedef enum TC_BYTEM_enum
+{
+    TC_BYTEM_NORMAL_gc = (0x00<<0),  /* 16-bit mode */
+    TC_BYTEM_BYTEMODE_gc = (0x01<<0),  /* Timer/Counter operating in byte mode only */
+    TC_BYTEM_SPLITMODE_gc = (0x02<<0),  /* Timer/Counter split into two 8-bit Counters (TC2) */
+} TC_BYTEM_t;
+
+/* Event Action */
+typedef enum TC_EVACT_enum
+{
+    TC_EVACT_OFF_gc = (0x00<<5),  /* No Event Action */
+    TC_EVACT_CAPT_gc = (0x01<<5),  /* Input Capture */
+    TC_EVACT_UPDOWN_gc = (0x02<<5),  /* Externally Controlled Up/Down Count */
+    TC_EVACT_QDEC_gc = (0x03<<5),  /* Quadrature Decode */
+    TC_EVACT_RESTART_gc = (0x04<<5),  /* Restart */
+    TC_EVACT_FRQ_gc = (0x05<<5),  /* Frequency Capture */
+    TC_EVACT_PW_gc = (0x06<<5),  /* Pulse-width Capture */
+} TC_EVACT_t;
+
+/* Event Selection */
+typedef enum TC_EVSEL_enum
+{
+    TC_EVSEL_OFF_gc = (0x00<<0),  /* No Event Source */
+    TC_EVSEL_CH0_gc = (0x08<<0),  /* Event Channel 0 */
+    TC_EVSEL_CH1_gc = (0x09<<0),  /* Event Channel 1 */
+    TC_EVSEL_CH2_gc = (0x0A<<0),  /* Event Channel 2 */
+    TC_EVSEL_CH3_gc = (0x0B<<0),  /* Event Channel 3 */
+    TC_EVSEL_CH4_gc = (0x0C<<0),  /* Event Channel 4 */
+    TC_EVSEL_CH5_gc = (0x0D<<0),  /* Event Channel 5 */
+    TC_EVSEL_CH6_gc = (0x0E<<0),  /* Event Channel 6 */
+    TC_EVSEL_CH7_gc = (0x0F<<0),  /* Event Channel 7 */
+} TC_EVSEL_t;
+
+/* Error Interrupt Level */
+typedef enum TC_ERRINTLVL_enum
+{
+    TC_ERRINTLVL_OFF_gc = (0x00<<2),  /* Interrupt Disabled */
+    TC_ERRINTLVL_LO_gc = (0x01<<2),  /* Low Level */
+    TC_ERRINTLVL_MED_gc = (0x02<<2),  /* Medium Level */
+    TC_ERRINTLVL_HI_gc = (0x03<<2),  /* High Level */
+} TC_ERRINTLVL_t;
+
+/* Overflow Interrupt Level */
+typedef enum TC_OVFINTLVL_enum
+{
+    TC_OVFINTLVL_OFF_gc = (0x00<<0),  /* Interrupt Disabled */
+    TC_OVFINTLVL_LO_gc = (0x01<<0),  /* Low Level */
+    TC_OVFINTLVL_MED_gc = (0x02<<0),  /* Medium Level */
+    TC_OVFINTLVL_HI_gc = (0x03<<0),  /* High Level */
+} TC_OVFINTLVL_t;
+
+/* Compare or Capture D Interrupt Level */
+typedef enum TC_CCDINTLVL_enum
+{
+    TC_CCDINTLVL_OFF_gc = (0x00<<6),  /* Interrupt Disabled */
+    TC_CCDINTLVL_LO_gc = (0x01<<6),  /* Low Level */
+    TC_CCDINTLVL_MED_gc = (0x02<<6),  /* Medium Level */
+    TC_CCDINTLVL_HI_gc = (0x03<<6),  /* High Level */
+} TC_CCDINTLVL_t;
+
+/* Compare or Capture C Interrupt Level */
+typedef enum TC_CCCINTLVL_enum
+{
+    TC_CCCINTLVL_OFF_gc = (0x00<<4),  /* Interrupt Disabled */
+    TC_CCCINTLVL_LO_gc = (0x01<<4),  /* Low Level */
+    TC_CCCINTLVL_MED_gc = (0x02<<4),  /* Medium Level */
+    TC_CCCINTLVL_HI_gc = (0x03<<4),  /* High Level */
+} TC_CCCINTLVL_t;
+
+/* Compare or Capture B Interrupt Level */
+typedef enum TC_CCBINTLVL_enum
+{
+    TC_CCBINTLVL_OFF_gc = (0x00<<2),  /* Interrupt Disabled */
+    TC_CCBINTLVL_LO_gc = (0x01<<2),  /* Low Level */
+    TC_CCBINTLVL_MED_gc = (0x02<<2),  /* Medium Level */
+    TC_CCBINTLVL_HI_gc = (0x03<<2),  /* High Level */
+} TC_CCBINTLVL_t;
+
+/* Compare or Capture A Interrupt Level */
+typedef enum TC_CCAINTLVL_enum
+{
+    TC_CCAINTLVL_OFF_gc = (0x00<<0),  /* Interrupt Disabled */
+    TC_CCAINTLVL_LO_gc = (0x01<<0),  /* Low Level */
+    TC_CCAINTLVL_MED_gc = (0x02<<0),  /* Medium Level */
+    TC_CCAINTLVL_HI_gc = (0x03<<0),  /* High Level */
+} TC_CCAINTLVL_t;
+
+/* Timer/Counter Command */
+typedef enum TC_CMD_enum
+{
+    TC_CMD_NONE_gc = (0x00<<2),  /* No Command */
+    TC_CMD_UPDATE_gc = (0x01<<2),  /* Force Update */
+    TC_CMD_RESTART_gc = (0x02<<2),  /* Force Restart */
+    TC_CMD_RESET_gc = (0x03<<2),  /* Force Hard Reset */
+} TC_CMD_t;
+
+
+/*
+--------------------------------------------------------------------------
+TC2 - 16-bit Timer/Counter type 2
+--------------------------------------------------------------------------
+*/
+
+/* 16-bit Timer/Counter type 2 */
+typedef struct TC2_struct
+{
+    register8_t CTRLA;  /* Control Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t CTRLC;  /* Control register C */
+    register8_t reserved_0x03;
+    register8_t CTRLE;  /* Control Register E */
+    register8_t reserved_0x05;
+    register8_t INTCTRLA;  /* Interrupt Control Register A */
+    register8_t INTCTRLB;  /* Interrupt Control Register B */
+    register8_t reserved_0x08;
+    register8_t CTRLF;  /* Control Register F */
+    register8_t reserved_0x0A;
+    register8_t reserved_0x0B;
+    register8_t INTFLAGS;  /* Interrupt Flag Register */
+    register8_t reserved_0x0D;
+    register8_t reserved_0x0E;
+    register8_t reserved_0x0F;
+    register8_t reserved_0x10;
+    register8_t reserved_0x11;
+    register8_t reserved_0x12;
+    register8_t reserved_0x13;
+    register8_t reserved_0x14;
+    register8_t reserved_0x15;
+    register8_t reserved_0x16;
+    register8_t reserved_0x17;
+    register8_t reserved_0x18;
+    register8_t reserved_0x19;
+    register8_t reserved_0x1A;
+    register8_t reserved_0x1B;
+    register8_t reserved_0x1C;
+    register8_t reserved_0x1D;
+    register8_t reserved_0x1E;
+    register8_t reserved_0x1F;
+    register8_t LCNT;  /* Low Byte Count */
+    register8_t HCNT;  /* High Byte Count */
+    register8_t reserved_0x22;
+    register8_t reserved_0x23;
+    register8_t reserved_0x24;
+    register8_t reserved_0x25;
+    register8_t LPER;  /* Low Byte Period */
+    register8_t HPER;  /* High Byte Period */
+    register8_t LCMPA;  /* Low Byte Compare A */
+    register8_t HCMPA;  /* High Byte Compare A */
+    register8_t LCMPB;  /* Low Byte Compare B */
+    register8_t HCMPB;  /* High Byte Compare B */
+    register8_t LCMPC;  /* Low Byte Compare C */
+    register8_t HCMPC;  /* High Byte Compare C */
+    register8_t LCMPD;  /* Low Byte Compare D */
+    register8_t HCMPD;  /* High Byte Compare D */
+} TC2_t;
+
+/* Clock Selection */
+typedef enum TC2_CLKSEL_enum
+{
+    TC2_CLKSEL_OFF_gc = (0x00<<0),  /* Timer Off */
+    TC2_CLKSEL_DIV1_gc = (0x01<<0),  /* System Clock */
+    TC2_CLKSEL_DIV2_gc = (0x02<<0),  /* System Clock / 2 */
+    TC2_CLKSEL_DIV4_gc = (0x03<<0),  /* System Clock / 4 */
+    TC2_CLKSEL_DIV8_gc = (0x04<<0),  /* System Clock / 8 */
+    TC2_CLKSEL_DIV64_gc = (0x05<<0),  /* System Clock / 64 */
+    TC2_CLKSEL_DIV256_gc = (0x06<<0),  /* System Clock / 256 */
+    TC2_CLKSEL_DIV1024_gc = (0x07<<0),  /* System Clock / 1024 */
+    TC2_CLKSEL_EVCH0_gc = (0x08<<0),  /* Event Channel 0 */
+    TC2_CLKSEL_EVCH1_gc = (0x09<<0),  /* Event Channel 1 */
+    TC2_CLKSEL_EVCH2_gc = (0x0A<<0),  /* Event Channel 2 */
+    TC2_CLKSEL_EVCH3_gc = (0x0B<<0),  /* Event Channel 3 */
+    TC2_CLKSEL_EVCH4_gc = (0x0C<<0),  /* Event Channel 4 */
+    TC2_CLKSEL_EVCH5_gc = (0x0D<<0),  /* Event Channel 5 */
+    TC2_CLKSEL_EVCH6_gc = (0x0E<<0),  /* Event Channel 6 */
+    TC2_CLKSEL_EVCH7_gc = (0x0F<<0),  /* Event Channel 7 */
+} TC2_CLKSEL_t;
+
+/* Byte Mode */
+typedef enum TC2_BYTEM_enum
+{
+    TC2_BYTEM_NORMAL_gc = (0x00<<0),  /* 16-bit mode */
+    TC2_BYTEM_BYTEMODE_gc = (0x01<<0),  /* Timer/Counter operating in byte mode only (TC2) */
+    TC2_BYTEM_SPLITMODE_gc = (0x02<<0),  /* Timer/Counter split into two 8-bit Counters */
+} TC2_BYTEM_t;
+
+/* High Byte Underflow Interrupt Level */
+typedef enum TC2_HUNFINTLVL_enum
+{
+    TC2_HUNFINTLVL_OFF_gc = (0x00<<2),  /* Interrupt Disabled */
+    TC2_HUNFINTLVL_LO_gc = (0x01<<2),  /* Low Level */
+    TC2_HUNFINTLVL_MED_gc = (0x02<<2),  /* Medium Level */
+    TC2_HUNFINTLVL_HI_gc = (0x03<<2),  /* High Level */
+} TC2_HUNFINTLVL_t;
+
+/* Low Byte Underflow Interrupt Level */
+typedef enum TC2_LUNFINTLVL_enum
+{
+    TC2_LUNFINTLVL_OFF_gc = (0x00<<0),  /* Interrupt Disabled */
+    TC2_LUNFINTLVL_LO_gc = (0x01<<0),  /* Low Level */
+    TC2_LUNFINTLVL_MED_gc = (0x02<<0),  /* Medium Level */
+    TC2_LUNFINTLVL_HI_gc = (0x03<<0),  /* High Level */
+} TC2_LUNFINTLVL_t;
+
+/* Low Byte Compare D Interrupt Level */
+typedef enum TC2_LCMPDINTLVL_enum
+{
+    TC2_LCMPDINTLVL_OFF_gc = (0x00<<6),  /* Interrupt Disabled */
+    TC2_LCMPDINTLVL_LO_gc = (0x01<<6),  /* Low Level */
+    TC2_LCMPDINTLVL_MED_gc = (0x02<<6),  /* Medium Level */
+    TC2_LCMPDINTLVL_HI_gc = (0x03<<6),  /* High Level */
+} TC2_LCMPDINTLVL_t;
+
+/* Low Byte Compare C Interrupt Level */
+typedef enum TC2_LCMPCINTLVL_enum
+{
+    TC2_LCMPCINTLVL_OFF_gc = (0x00<<4),  /* Interrupt Disabled */
+    TC2_LCMPCINTLVL_LO_gc = (0x01<<4),  /* Low Level */
+    TC2_LCMPCINTLVL_MED_gc = (0x02<<4),  /* Medium Level */
+    TC2_LCMPCINTLVL_HI_gc = (0x03<<4),  /* High Level */
+} TC2_LCMPCINTLVL_t;
+
+/* Low Byte Compare B Interrupt Level */
+typedef enum TC2_LCMPBINTLVL_enum
+{
+    TC2_LCMPBINTLVL_OFF_gc = (0x00<<2),  /* Interrupt Disabled */
+    TC2_LCMPBINTLVL_LO_gc = (0x01<<2),  /* Low Level */
+    TC2_LCMPBINTLVL_MED_gc = (0x02<<2),  /* Medium Level */
+    TC2_LCMPBINTLVL_HI_gc = (0x03<<2),  /* High Level */
+} TC2_LCMPBINTLVL_t;
+
+/* Low Byte Compare A Interrupt Level */
+typedef enum TC2_LCMPAINTLVL_enum
+{
+    TC2_LCMPAINTLVL_OFF_gc = (0x00<<0),  /* Interrupt Disabled */
+    TC2_LCMPAINTLVL_LO_gc = (0x01<<0),  /* Low Level */
+    TC2_LCMPAINTLVL_MED_gc = (0x02<<0),  /* Medium Level */
+    TC2_LCMPAINTLVL_HI_gc = (0x03<<0),  /* High Level */
+} TC2_LCMPAINTLVL_t;
+
+/* Timer/Counter Command */
+typedef enum TC2_CMD_enum
+{
+    TC2_CMD_NONE_gc = (0x00<<2),  /* No Command */
+    TC2_CMD_RESTART_gc = (0x02<<2),  /* Force Restart */
+    TC2_CMD_RESET_gc = (0x03<<2),  /* Force Hard Reset */
+} TC2_CMD_t;
+
+/* Timer/Counter Command */
+typedef enum TC2_CMDEN_enum
+{
+    TC2_CMDEN_LOW_gc = (0x01<<0),  /* Low Byte Timer/Counter */
+    TC2_CMDEN_HIGH_gc = (0x02<<0),  /* High Byte Timer/Counter */
+    TC2_CMDEN_BOTH_gc = (0x03<<0),  /* Both Low Byte and High Byte Timer/Counters */
+} TC2_CMDEN_t;
+
+
+/*
+--------------------------------------------------------------------------
+AWEX - Timer/Counter Advanced Waveform Extension
+--------------------------------------------------------------------------
+*/
+
+/* Advanced Waveform Extension */
+typedef struct AWEX_struct
+{
+    register8_t CTRL;  /* Control Register */
+    register8_t reserved_0x01;
+    register8_t FDEMASK;  /* Fault Detection Event Mask */
+    register8_t FDCTRL;  /* Fault Detection Control Register */
+    register8_t STATUS;  /* Status Register */
+    register8_t STATUSSET;  /* Status Set Register */
+    register8_t DTBOTH;  /* Dead Time Both Sides */
+    register8_t DTBOTHBUF;  /* Dead Time Both Sides Buffer */
+    register8_t DTLS;  /* Dead Time Low Side */
+    register8_t DTHS;  /* Dead Time High Side */
+    register8_t DTLSBUF;  /* Dead Time Low Side Buffer */
+    register8_t DTHSBUF;  /* Dead Time High Side Buffer */
+    register8_t OUTOVEN;  /* Output Override Enable */
+} AWEX_t;
+
+/* Fault Detect Action */
+typedef enum AWEX_FDACT_enum
+{
+    AWEX_FDACT_NONE_gc = (0x00<<0),  /* No Fault Protection */
+    AWEX_FDACT_CLEAROE_gc = (0x01<<0),  /* Clear Output Enable Bits */
+    AWEX_FDACT_CLEARDIR_gc = (0x03<<0),  /* Clear I/O Port Direction Bits */
+} AWEX_FDACT_t;
+
+
+/*
+--------------------------------------------------------------------------
+HIRES - Timer/Counter High-Resolution Extension
+--------------------------------------------------------------------------
+*/
+
+/* High-Resolution Extension */
+typedef struct HIRES_struct
+{
+    register8_t CTRLA;  /* Control Register */
+} HIRES_t;
+
+/* High Resolution Enable */
+typedef enum HIRES_HREN_enum
+{
+    HIRES_HREN_NONE_gc = (0x00<<0),  /* No Fault Protection */
+    HIRES_HREN_TC0_gc = (0x01<<0),  /* Enable High Resolution on Timer/Counter 0 */
+    HIRES_HREN_TC1_gc = (0x02<<0),  /* Enable High Resolution on Timer/Counter 1 */
+    HIRES_HREN_BOTH_gc = (0x03<<0),  /* Enable High Resolution both Timer/Counters */
+} HIRES_HREN_t;
+
+
+/*
+--------------------------------------------------------------------------
+USART - Universal Asynchronous Receiver-Transmitter
+--------------------------------------------------------------------------
+*/
+
+/* Universal Synchronous/Asynchronous Receiver/Transmitter */
+typedef struct USART_struct
+{
+    register8_t DATA;  /* Data Register */
+    register8_t STATUS;  /* Status Register */
+    register8_t reserved_0x02;
+    register8_t CTRLA;  /* Control Register A */
+    register8_t CTRLB;  /* Control Register B */
+    register8_t CTRLC;  /* Control Register C */
+    register8_t BAUDCTRLA;  /* Baud Rate Control Register A */
+    register8_t BAUDCTRLB;  /* Baud Rate Control Register B */
+} USART_t;
+
+/* Receive Complete Interrupt level */
+typedef enum USART_RXCINTLVL_enum
+{
+    USART_RXCINTLVL_OFF_gc = (0x00<<4),  /* Interrupt Disabled */
+    USART_RXCINTLVL_LO_gc = (0x01<<4),  /* Low Level */
+    USART_RXCINTLVL_MED_gc = (0x02<<4),  /* Medium Level */
+    USART_RXCINTLVL_HI_gc = (0x03<<4),  /* High Level */
+} USART_RXCINTLVL_t;
+
+/* Transmit Complete Interrupt level */
+typedef enum USART_TXCINTLVL_enum
+{
+    USART_TXCINTLVL_OFF_gc = (0x00<<2),  /* Interrupt Disabled */
+    USART_TXCINTLVL_LO_gc = (0x01<<2),  /* Low Level */
+    USART_TXCINTLVL_MED_gc = (0x02<<2),  /* Medium Level */
+    USART_TXCINTLVL_HI_gc = (0x03<<2),  /* High Level */
+} USART_TXCINTLVL_t;
+
+/* Data Register Empty Interrupt level */
+typedef enum USART_DREINTLVL_enum
+{
+    USART_DREINTLVL_OFF_gc = (0x00<<0),  /* Interrupt Disabled */
+    USART_DREINTLVL_LO_gc = (0x01<<0),  /* Low Level */
+    USART_DREINTLVL_MED_gc = (0x02<<0),  /* Medium Level */
+    USART_DREINTLVL_HI_gc = (0x03<<0),  /* High Level */
+} USART_DREINTLVL_t;
+
+/* Character Size */
+typedef enum USART_CHSIZE_enum
+{
+    USART_CHSIZE_5BIT_gc = (0x00<<0),  /* Character size: 5 bit */
+    USART_CHSIZE_6BIT_gc = (0x01<<0),  /* Character size: 6 bit */
+    USART_CHSIZE_7BIT_gc = (0x02<<0),  /* Character size: 7 bit */
+    USART_CHSIZE_8BIT_gc = (0x03<<0),  /* Character size: 8 bit */
+    USART_CHSIZE_9BIT_gc = (0x07<<0),  /* Character size: 9 bit */
+} USART_CHSIZE_t;
+
+/* Communication Mode */
+typedef enum USART_CMODE_enum
+{
+    USART_CMODE_ASYNCHRONOUS_gc = (0x00<<6),  /* Asynchronous Mode */
+    USART_CMODE_SYNCHRONOUS_gc = (0x01<<6),  /* Synchronous Mode */
+    USART_CMODE_IRDA_gc = (0x02<<6),  /* IrDA Mode */
+    USART_CMODE_MSPI_gc = (0x03<<6),  /* Master SPI Mode */
+} USART_CMODE_t;
+
+/* Parity Mode */
+typedef enum USART_PMODE_enum
+{
+    USART_PMODE_DISABLED_gc = (0x00<<4),  /* No Parity */
+    USART_PMODE_EVEN_gc = (0x02<<4),  /* Even Parity */
+    USART_PMODE_ODD_gc = (0x03<<4),  /* Odd Parity */
+} USART_PMODE_t;
+
+
+/*
+--------------------------------------------------------------------------
+SPI - Serial Peripheral Interface
+--------------------------------------------------------------------------
+*/
+
+/* Serial Peripheral Interface */
+typedef struct SPI_struct
+{
+    register8_t CTRL;  /* Control Register */
+    register8_t INTCTRL;  /* Interrupt Control Register */
+    register8_t STATUS;  /* Status Register */
+    register8_t DATA;  /* Data Register */
+} SPI_t;
+
+/* SPI Mode */
+typedef enum SPI_MODE_enum
+{
+    SPI_MODE_0_gc = (0x00<<2),  /* SPI Mode 0 */
+    SPI_MODE_1_gc = (0x01<<2),  /* SPI Mode 1 */
+    SPI_MODE_2_gc = (0x02<<2),  /* SPI Mode 2 */
+    SPI_MODE_3_gc = (0x03<<2),  /* SPI Mode 3 */
+} SPI_MODE_t;
+
+/* Prescaler setting */
+typedef enum SPI_PRESCALER_enum
+{
+    SPI_PRESCALER_DIV4_gc = (0x00<<0),  /* System Clock / 4 */
+    SPI_PRESCALER_DIV16_gc = (0x01<<0),  /* System Clock / 16 */
+    SPI_PRESCALER_DIV64_gc = (0x02<<0),  /* System Clock / 64 */
+    SPI_PRESCALER_DIV128_gc = (0x03<<0),  /* System Clock / 128 */
+} SPI_PRESCALER_t;
+
+/* Interrupt level */
+typedef enum SPI_INTLVL_enum
+{
+    SPI_INTLVL_OFF_gc = (0x00<<0),  /* Interrupt Disabled */
+    SPI_INTLVL_LO_gc = (0x01<<0),  /* Low Level */
+    SPI_INTLVL_MED_gc = (0x02<<0),  /* Medium Level */
+    SPI_INTLVL_HI_gc = (0x03<<0),  /* High Level */
+} SPI_INTLVL_t;
+
+
+/*
+--------------------------------------------------------------------------
+IRCOM - IR Communication Module
+--------------------------------------------------------------------------
+*/
+
+/* IR Communication Module */
+typedef struct IRCOM_struct
+{
+    register8_t CTRL;  /* Control Register */
+    register8_t TXPLCTRL;  /* IrDA Transmitter Pulse Length Control Register */
+    register8_t RXPLCTRL;  /* IrDA Receiver Pulse Length Control Register */
+} IRCOM_t;
+
+/* Event channel selection */
+typedef enum IRDA_EVSEL_enum
+{
+    IRDA_EVSEL_OFF_gc = (0x00<<0),  /* No Event Source */
+    IRDA_EVSEL_0_gc = (0x08<<0),  /* Event Channel 0 */
+    IRDA_EVSEL_1_gc = (0x09<<0),  /* Event Channel 1 */
+    IRDA_EVSEL_2_gc = (0x0A<<0),  /* Event Channel 2 */
+    IRDA_EVSEL_3_gc = (0x0B<<0),  /* Event Channel 3 */
+    IRDA_EVSEL_4_gc = (0x0C<<0),  /* Event Channel 4 */
+    IRDA_EVSEL_5_gc = (0x0D<<0),  /* Event Channel 5 */
+    IRDA_EVSEL_6_gc = (0x0E<<0),  /* Event Channel 6 */
+    IRDA_EVSEL_7_gc = (0x0F<<0),  /* Event Channel 7 */
+} IRDA_EVSEL_t;
+
+
+/*
+--------------------------------------------------------------------------
+FUSE - Fuses and Lockbits
+--------------------------------------------------------------------------
+*/
+
+/* Fuses */
+typedef struct NVM_FUSES_struct
+{
+    register8_t FUSEBYTE0;  /* JTAG User ID */
+    register8_t FUSEBYTE1;  /* Watchdog Configuration */
+    register8_t FUSEBYTE2;  /* Reset Configuration */
+    register8_t reserved_0x03;
+    register8_t FUSEBYTE4;  /* Start-up Configuration */
+    register8_t FUSEBYTE5;  /* EESAVE and BOD Level */
+} NVM_FUSES_t;
+
+/* Boot Loader Section Reset Vector */
+typedef enum BOOTRST_enum
+{
+    BOOTRST_BOOTLDR_gc = (0x00<<6),  /* Boot Loader Reset */
+    BOOTRST_APPLICATION_gc = (0x01<<6),  /* Application Reset */
+} BOOTRST_t;
+
+/* Timer Oscillator pin location */
+typedef enum TOSCSEL_enum
+{
+    TOSCSEL_ALTERNATE_gc = (0x00<<5),  /* TOSC1 / TOSC2 on separate pins */
+    TOSCSEL_XTAL_gc = (0x01<<5),  /* TOSC1 / TOSC2 shared with XTAL1 / XTAL2 */
+} TOSCSEL_t;
+
+/* BOD operation */
+typedef enum BOD_enum
+{
+    BOD_SAMPLED_gc = (0x01<<0),  /* BOD enabled in sampled mode */
+    BOD_CONTINUOUS_gc = (0x02<<0),  /* BOD enabled continuously */
+    BOD_DISABLED_gc = (0x03<<0),  /* BOD Disabled */
+} BOD_t;
+
+/* BOD operation */
+typedef enum BODACT_enum
+{
+    BODACT_SAMPLED_gc = (0x01<<4),  /* BOD enabled in sampled mode */
+    BODACT_CONTINUOUS_gc = (0x02<<4),  /* BOD enabled continuously */
+    BODACT_DISABLED_gc = (0x03<<4),  /* BOD Disabled */
+} BODACT_t;
+
+/* Watchdog (Window) Timeout Period */
+typedef enum WD_enum
+{
+    WD_8CLK_gc = (0x00<<4),  /* 8 cycles (8ms @ 3.3V) */
+    WD_16CLK_gc = (0x01<<4),  /* 16 cycles (16ms @ 3.3V) */
+    WD_32CLK_gc = (0x02<<4),  /* 32 cycles (32ms @ 3.3V) */
+    WD_64CLK_gc = (0x03<<4),  /* 64 cycles (64ms @ 3.3V) */
+    WD_128CLK_gc = (0x04<<4),  /* 128 cycles (0.125s @ 3.3V) */
+    WD_256CLK_gc = (0x05<<4),  /* 256 cycles (0.25s @ 3.3V) */
+    WD_512CLK_gc = (0x06<<4),  /* 512 cycles (0.5s @ 3.3V) */
+    WD_1KCLK_gc = (0x07<<4),  /* 1K cycles (1s @ 3.3V) */
+    WD_2KCLK_gc = (0x08<<4),  /* 2K cycles (2s @ 3.3V) */
+    WD_4KCLK_gc = (0x09<<4),  /* 4K cycles (4s @ 3.3V) */
+    WD_8KCLK_gc = (0x0A<<4),  /* 8K cycles (8s @ 3.3V) */
+} WD_t;
+
+/* Watchdog (Window) Timeout Period */
+typedef enum WDP_enum
+{
+    WDP_8CLK_gc = (0x00<<0),  /* 8 cycles (8ms @ 3.3V) */
+    WDP_16CLK_gc = (0x01<<0),  /* 16 cycles (16ms @ 3.3V) */
+    WDP_32CLK_gc = (0x02<<0),  /* 32 cycles (32ms @ 3.3V) */
+    WDP_64CLK_gc = (0x03<<0),  /* 64 cycles (64ms @ 3.3V) */
+    WDP_128CLK_gc = (0x04<<0),  /* 128 cycles (0.125s @ 3.3V) */
+    WDP_256CLK_gc = (0x05<<0),  /* 256 cycles (0.25s @ 3.3V) */
+    WDP_512CLK_gc = (0x06<<0),  /* 512 cycles (0.5s @ 3.3V) */
+    WDP_1KCLK_gc = (0x07<<0),  /* 1K cycles (1s @ 3.3V) */
+    WDP_2KCLK_gc = (0x08<<0),  /* 2K cycles (2s @ 3.3V) */
+    WDP_4KCLK_gc = (0x09<<0),  /* 4K cycles (4s @ 3.3V) */
+    WDP_8KCLK_gc = (0x0A<<0),  /* 8K cycles (8s @ 3.3V) */
+} WDP_t;
+
+/* Start-up Time */
+typedef enum SUT_enum
+{
+    SUT_0MS_gc = (0x03<<2),  /* 0 ms */
+    SUT_4MS_gc = (0x01<<2),  /* 4 ms */
+    SUT_64MS_gc = (0x00<<2),  /* 64 ms */
+} SUT_t;
+
+/* Brownout Detection Voltage Level */
+typedef enum BODLVL_enum
+{
+    BODLVL_1V6_gc = (0x07<<0),  /* 1.6 V */
+    BODLVL_1V8_gc = (0x06<<0),  /* 1.8 V */
+    BODLVL_2V0_gc = (0x05<<0),  /* 2.0 V */
+    BODLVL_2V2_gc = (0x04<<0),  /* 2.2 V */
+    BODLVL_2V4_gc = (0x03<<0),  /* 2.4 V */
+    BODLVL_2V6_gc = (0x02<<0),  /* 2.6 V */
+    BODLVL_2V8_gc = (0x01<<0),  /* 2.8 V */
+    BODLVL_3V0_gc = (0x00<<0),  /* 3.0 V */
+} BODLVL_t;
+
+
+/*
+--------------------------------------------------------------------------
+LOCKBIT - Fuses and Lockbits
+--------------------------------------------------------------------------
+*/
+
+/* Lock Bits */
+typedef struct NVM_LOCKBITS_struct
+{
+    register8_t LOCK_BITS;  /* Lock Bits (Changed from LOCKBITS to avoid avr-libc collision) */
+} NVM_LOCKBITS_t;
+
+/* Boot lock bits - boot setcion */
+typedef enum FUSE_BLBB_enum
+{
+    FUSE_BLBB_RWLOCK_gc = (0x00<<6),  /* Read and write not allowed */
+    FUSE_BLBB_RLOCK_gc = (0x01<<6),  /* Read not allowed */
+    FUSE_BLBB_WLOCK_gc = (0x02<<6),  /* Write not allowed */
+    FUSE_BLBB_NOLOCK_gc = (0x03<<6),  /* No locks */
+} FUSE_BLBB_t;
+
+/* Boot lock bits - application section */
+typedef enum FUSE_BLBA_enum
+{
+    FUSE_BLBA_RWLOCK_gc = (0x00<<4),  /* Read and write not allowed */
+    FUSE_BLBA_RLOCK_gc = (0x01<<4),  /* Read not allowed */
+    FUSE_BLBA_WLOCK_gc = (0x02<<4),  /* Write not allowed */
+    FUSE_BLBA_NOLOCK_gc = (0x03<<4),  /* No locks */
+} FUSE_BLBA_t;
+
+/* Boot lock bits - application table section */
+typedef enum FUSE_BLBAT_enum
+{
+    FUSE_BLBAT_RWLOCK_gc = (0x00<<2),  /* Read and write not allowed */
+    FUSE_BLBAT_RLOCK_gc = (0x01<<2),  /* Read not allowed */
+    FUSE_BLBAT_WLOCK_gc = (0x02<<2),  /* Write not allowed */
+    FUSE_BLBAT_NOLOCK_gc = (0x03<<2),  /* No locks */
+} FUSE_BLBAT_t;
+
+/* Lock bits */
+typedef enum FUSE_LB_enum
+{
+    FUSE_LB_RWLOCK_gc = (0x00<<0),  /* Read and write not allowed */
+    FUSE_LB_WLOCK_gc = (0x02<<0),  /* Write not allowed */
+    FUSE_LB_NOLOCK_gc = (0x03<<0),  /* No locks */
+} FUSE_LB_t;
+
+
+/*
+--------------------------------------------------------------------------
+SIGROW - Signature Row
+--------------------------------------------------------------------------
+*/
+
+/* Production Signatures */
+typedef struct NVM_PROD_SIGNATURES_struct
+{
+    register8_t RCOSC2M;  /* RCOSC 2 MHz Calibration Value B */
+    register8_t RCOSC2MA;  /* RCOSC 2 MHz Calibration Value A */
+    register8_t RCOSC32K;  /* RCOSC 32.768 kHz Calibration Value */
+    register8_t RCOSC32M;  /* RCOSC 32 MHz Calibration Value B */
+    register8_t RCOSC32MA;  /* RCOSC 32 MHz Calibration Value A */
+    register8_t reserved_0x05;
+    register8_t reserved_0x06;
+    register8_t reserved_0x07;
+    register8_t LOTNUM0;  /* Lot Number Byte 0, ASCII */
+    register8_t LOTNUM1;  /* Lot Number Byte 1, ASCII */
+    register8_t LOTNUM2;  /* Lot Number Byte 2, ASCII */
+    register8_t LOTNUM3;  /* Lot Number Byte 3, ASCII */
+    register8_t LOTNUM4;  /* Lot Number Byte 4, ASCII */
+    register8_t LOTNUM5;  /* Lot Number Byte 5, ASCII */
+    register8_t reserved_0x0E;
+    register8_t reserved_0x0F;
+    register8_t WAFNUM;  /* Wafer Number */
+    register8_t reserved_0x11;
+    register8_t COORDX0;  /* Wafer Coordinate X Byte 0 */
+    register8_t COORDX1;  /* Wafer Coordinate X Byte 1 */
+    register8_t COORDY0;  /* Wafer Coordinate Y Byte 0 */
+    register8_t COORDY1;  /* Wafer Coordinate Y Byte 1 */
+    register8_t reserved_0x16;
+    register8_t reserved_0x17;
+    register8_t reserved_0x18;
+    register8_t reserved_0x19;
+    register8_t USBCAL0;  /* USB Calibration Byte 0 */
+    register8_t USBCAL1;  /* USB Calibration Byte 1 */
+    register8_t USBRCOSC;  /* USB RCOSC Calibration Value B */
+    register8_t USBRCOSCA;  /* USB RCOSC Calibration Value A */
+    register8_t reserved_0x1E;
+    register8_t reserved_0x1F;
+    register8_t ADCACAL0;  /* ADCA Calibration Byte 0 */
+    register8_t ADCACAL1;  /* ADCA Calibration Byte 1 */
+    register8_t reserved_0x22;
+    register8_t reserved_0x23;
+    register8_t ADCBCAL0;  /* ADCB Calibration Byte 0 */
+    register8_t ADCBCAL1;  /* ADCB Calibration Byte 1 */
+    register8_t reserved_0x26;
+    register8_t reserved_0x27;
+    register8_t reserved_0x28;
+    register8_t reserved_0x29;
+    register8_t reserved_0x2A;
+    register8_t reserved_0x2B;
+    register8_t reserved_0x2C;
+    register8_t reserved_0x2D;
+    register8_t TEMPSENSE0;  /* Temperature Sensor Calibration Byte 0 */
+    register8_t TEMPSENSE1;  /* Temperature Sensor Calibration Byte 1 */
+    register8_t DACA0OFFCAL;  /* DACA0 Calibration Byte 0 */
+    register8_t DACA0GAINCAL;  /* DACA0 Calibration Byte 1 */
+    register8_t DACB0OFFCAL;  /* DACB0 Calibration Byte 0 */
+    register8_t DACB0GAINCAL;  /* DACB0 Calibration Byte 1 */
+    register8_t DACA1OFFCAL;  /* DACA1 Calibration Byte 0 */
+    register8_t DACA1GAINCAL;  /* DACA1 Calibration Byte 1 */
+    register8_t DACB1OFFCAL;  /* DACB1 Calibration Byte 0 */
+    register8_t DACB1GAINCAL;  /* DACB1 Calibration Byte 1 */
+    register8_t reserved_0x38;
+    register8_t reserved_0x39;
+    register8_t reserved_0x3A;
+    register8_t reserved_0x3B;
+    register8_t reserved_0x3C;
+    register8_t reserved_0x3D;
+    register8_t reserved_0x3E;
+    register8_t reserved_0x3F;
+    register8_t reserved_0x40;
+    register8_t reserved_0x41;
+    register8_t reserved_0x42;
+    register8_t reserved_0x43;
+    register8_t reserved_0x44;
+    register8_t reserved_0x45;
+    register8_t reserved_0x46;
+    register8_t reserved_0x47;
+} NVM_PROD_SIGNATURES_t;
+
+/*
+==========================================================================
+IO Module Instances. Mapped to memory.
+==========================================================================
+*/
+
+#define VPORT0    (*(VPORT_t *)(io_mem + 0x0010))  /* Virtual Port */
+#define VPORT1    (*(VPORT_t *)(io_mem + 0x0014))  /* Virtual Port */
+#define VPORT2    (*(VPORT_t *)(io_mem + 0x0018))  /* Virtual Port */
+#define VPORT3    (*(VPORT_t *)(io_mem + 0x001C))  /* Virtual Port */
+#define OCD    (*(OCD_t *)(io_mem + 0x002E))  /* On-Chip Debug System */
+#define CLK    (*(CLK_t *)(io_mem + 0x0040))  /* Clock System */
+#define SLEEP    (*(SLEEP_t *)(io_mem + 0x0048))  /* Sleep Controller */
+#define OSC    (*(OSC_t *)(io_mem + 0x0050))  /* Oscillator */
+#define DFLLRC32M    (*(DFLL_t *)(io_mem + 0x0060))  /* DFLL */
+#define DFLLRC2M    (*(DFLL_t *)(io_mem + 0x0068))  /* DFLL */
+#define PR    (*(PR_t *)(io_mem + 0x0070))  /* Power Reduction */
+#define RST    (*(RST_t *)(io_mem + 0x0078))  /* Reset */
+#define WDT    (*(WDT_t *)(io_mem + 0x0080))  /* Watch-Dog Timer */
+#define MCU    (*(MCU_t *)(io_mem + 0x0090))  /* MCU Control */
+#define PMIC    (*(PMIC_t *)(io_mem + 0x00A0))  /* Programmable Multi-level Interrupt Controller */
+#define PORTCFG    (*(PORTCFG_t *)(io_mem + 0x00B0))  /* I/O port Configuration */
+#define AES    (*(AES_t *)(io_mem + 0x00C0))  /* AES Module */
+#define CRC    (*(CRC_t *)(io_mem + 0x00D0))  /* Cyclic Redundancy Checker */
+#define DMA    (*(DMA_t *)(io_mem + 0x0100))  /* DMA Controller */
+#define EVSYS    (*(EVSYS_t *)(io_mem + 0x0180))  /* Event System */
+#define NVM    (*(NVM_t *)(io_mem + 0x01C0))  /* Non-volatile Memory Controller */
+#define ADCA    (*(ADC_t *)(io_mem + 0x0200))  /* Analog-to-Digital Converter */
+#define ADCB    (*(ADC_t *)(io_mem + 0x0240))  /* Analog-to-Digital Converter */
+#define DACB    (*(DAC_t *)(io_mem + 0x0320))  /* Digital-to-Analog Converter */
+#define ACA    (*(AC_t *)(io_mem + 0x0380))  /* Analog Comparator */
+#define ACB    (*(AC_t *)(io_mem + 0x0390))  /* Analog Comparator */
+#define RTC    (*(RTC_t *)(io_mem + 0x0400))  /* Real-Time Counter */
+#define TWIC    (*(TWI_t *)(io_mem + 0x0480))  /* Two-Wire Interface */
+#define TWIE    (*(TWI_t *)(io_mem + 0x04A0))  /* Two-Wire Interface */
+#define USB    (*(USB_t *)(io_mem + 0x04C0))  /* Universal Serial Bus */
+#define PORTA    (*(PORT_t *)(io_mem + 0x0600))  /* I/O Ports */
+#define PORTB    (*(PORT_t *)(io_mem + 0x0620))  /* I/O Ports */
+#define PORTC    (*(PORT_t *)(io_mem + 0x0640))  /* I/O Ports */
+#define PORTD    (*(PORT_t *)(io_mem + 0x0660))  /* I/O Ports */
+#define PORTE    (*(PORT_t *)(io_mem + 0x0680))  /* I/O Ports */
+#define PORTF    (*(PORT_t *)(io_mem + 0x06A0))  /* I/O Ports */
+#define PORTR    (*(PORT_t *)(io_mem + 0x07E0))  /* I/O Ports */
+#define TCC0    (*(TC0_t *)(io_mem + 0x0800))  /* 16-bit Timer/Counter 0 */
+#define TCC2    (*(TC2_t *)(io_mem + 0x0800))  /* 16-bit Timer/Counter type 2 */
+#define TCC1    (*(TC1_t *)(io_mem + 0x0840))  /* 16-bit Timer/Counter 1 */
+#define AWEXC    (*(AWEX_t *)(io_mem + 0x0880))  /* Advanced Waveform Extension */
+#define HIRESC    (*(HIRES_t *)(io_mem + 0x0890))  /* High-Resolution Extension */
+#define USARTC0    (*(USART_t *)(io_mem + 0x08A0))  /* Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTC1    (*(USART_t *)(io_mem + 0x08B0))  /* Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define SPIC    (*(SPI_t *)(io_mem + 0x08C0))  /* Serial Peripheral Interface */
+#define IRCOM    (*(IRCOM_t *)(io_mem + 0x08F8))  /* IR Communication Module */
+#define TCD0    (*(TC0_t *)(io_mem + 0x0900))  /* 16-bit Timer/Counter 0 */
+#define TCD2    (*(TC2_t *)(io_mem + 0x0900))  /* 16-bit Timer/Counter type 2 */
+#define TCD1    (*(TC1_t *)(io_mem + 0x0940))  /* 16-bit Timer/Counter 1 */
+#define HIRESD    (*(HIRES_t *)(io_mem + 0x0990))  /* High-Resolution Extension */
+#define USARTD0    (*(USART_t *)(io_mem + 0x09A0))  /* Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTD1    (*(USART_t *)(io_mem + 0x09B0))  /* Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define SPID    (*(SPI_t *)(io_mem + 0x09C0))  /* Serial Peripheral Interface */
+#define TCE0    (*(TC0_t *)(io_mem + 0x0A00))  /* 16-bit Timer/Counter 0 */
+#define TCE2    (*(TC2_t *)(io_mem + 0x0A00))  /* 16-bit Timer/Counter type 2 */
+#define TCE1    (*(TC1_t *)(io_mem + 0x0A40))  /* 16-bit Timer/Counter 1 */
+#define AWEXE    (*(AWEX_t *)(io_mem + 0x0A80))  /* Advanced Waveform Extension */
+#define HIRESE    (*(HIRES_t *)(io_mem + 0x0A90))  /* High-Resolution Extension */
+#define USARTE0    (*(USART_t *)(io_mem + 0x0AA0))  /* Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTE1    (*(USART_t *)(io_mem + 0x0AB0))  /* Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define SPIE    (*(SPI_t *)(io_mem + 0x0AC0))  /* Serial Peripheral Interface */
+#define TCF0    (*(TC0_t *)(io_mem + 0x0B00))  /* 16-bit Timer/Counter 0 */
+#define TCF2    (*(TC2_t *)(io_mem + 0x0B00))  /* 16-bit Timer/Counter type 2 */
+#define HIRESF    (*(HIRES_t *)(io_mem + 0x0B90))  /* High-Resolution Extension */
+#define USARTF0    (*(USART_t *)(io_mem + 0x0BA0))  /* Universal Synchronous/Asynchronous Receiver/Transmitter */
+
+
+#endif /* !defined (__ASSEMBLER__) */
+
+
+/* ========== Flattened fully qualified IO register names ========== */
+
+/* GPIO - General Purpose IO Registers */
+#define GPIO_GPIOR0  _SFR_MEM8(0x0000)
+#define GPIO_GPIOR1  _SFR_MEM8(0x0001)
+#define GPIO_GPIOR2  _SFR_MEM8(0x0002)
+#define GPIO_GPIOR3  _SFR_MEM8(0x0003)
+#define GPIO_GPIOR4  _SFR_MEM8(0x0004)
+#define GPIO_GPIOR5  _SFR_MEM8(0x0005)
+#define GPIO_GPIOR6  _SFR_MEM8(0x0006)
+#define GPIO_GPIOR7  _SFR_MEM8(0x0007)
+#define GPIO_GPIOR8  _SFR_MEM8(0x0008)
+#define GPIO_GPIOR9  _SFR_MEM8(0x0009)
+#define GPIO_GPIORA  _SFR_MEM8(0x000A)
+#define GPIO_GPIORB  _SFR_MEM8(0x000B)
+#define GPIO_GPIORC  _SFR_MEM8(0x000C)
+#define GPIO_GPIORD  _SFR_MEM8(0x000D)
+#define GPIO_GPIORE  _SFR_MEM8(0x000E)
+#define GPIO_GPIORF  _SFR_MEM8(0x000F)
+
+/* Deprecated */
+#define GPIO_GPIO0  _SFR_MEM8(0x0000)
+#define GPIO_GPIO1  _SFR_MEM8(0x0001)
+#define GPIO_GPIO2  _SFR_MEM8(0x0002)
+#define GPIO_GPIO3  _SFR_MEM8(0x0003)
+#define GPIO_GPIO4  _SFR_MEM8(0x0004)
+#define GPIO_GPIO5  _SFR_MEM8(0x0005)
+#define GPIO_GPIO6  _SFR_MEM8(0x0006)
+#define GPIO_GPIO7  _SFR_MEM8(0x0007)
+#define GPIO_GPIO8  _SFR_MEM8(0x0008)
+#define GPIO_GPIO9  _SFR_MEM8(0x0009)
+#define GPIO_GPIOA  _SFR_MEM8(0x000A)
+#define GPIO_GPIOB  _SFR_MEM8(0x000B)
+#define GPIO_GPIOC  _SFR_MEM8(0x000C)
+#define GPIO_GPIOD  _SFR_MEM8(0x000D)
+#define GPIO_GPIOE  _SFR_MEM8(0x000E)
+#define GPIO_GPIOF  _SFR_MEM8(0x000F)
+
+/* NVM_FUSES - Fuses */
+#define FUSE_FUSEBYTE0  _SFR_MEM8(0x0000)
+#define FUSE_FUSEBYTE1  _SFR_MEM8(0x0001)
+#define FUSE_FUSEBYTE2  _SFR_MEM8(0x0002)
+#define FUSE_FUSEBYTE4  _SFR_MEM8(0x0004)
+#define FUSE_FUSEBYTE5  _SFR_MEM8(0x0005)
+
+/* NVM_LOCKBITS - Lock Bits */
+#define LOCKBIT_LOCKBITS  _SFR_MEM8(0x0000)
+
+/* NVM_PROD_SIGNATURES - Production Signatures */
+#define PRODSIGNATURES_RCOSC2M  _SFR_MEM8(0x0000)
+#define PRODSIGNATURES_RCOSC2MA  _SFR_MEM8(0x0001)
+#define PRODSIGNATURES_RCOSC32K  _SFR_MEM8(0x0002)
+#define PRODSIGNATURES_RCOSC32M  _SFR_MEM8(0x0003)
+#define PRODSIGNATURES_RCOSC32MA  _SFR_MEM8(0x0004)
+#define PRODSIGNATURES_LOTNUM0  _SFR_MEM8(0x0008)
+#define PRODSIGNATURES_LOTNUM1  _SFR_MEM8(0x0009)
+#define PRODSIGNATURES_LOTNUM2  _SFR_MEM8(0x000A)
+#define PRODSIGNATURES_LOTNUM3  _SFR_MEM8(0x000B)
+#define PRODSIGNATURES_LOTNUM4  _SFR_MEM8(0x000C)
+#define PRODSIGNATURES_LOTNUM5  _SFR_MEM8(0x000D)
+#define PRODSIGNATURES_WAFNUM  _SFR_MEM8(0x0010)
+#define PRODSIGNATURES_COORDX0  _SFR_MEM8(0x0012)
+#define PRODSIGNATURES_COORDX1  _SFR_MEM8(0x0013)
+#define PRODSIGNATURES_COORDY0  _SFR_MEM8(0x0014)
+#define PRODSIGNATURES_COORDY1  _SFR_MEM8(0x0015)
+#define PRODSIGNATURES_USBCAL0  _SFR_MEM8(0x001A)
+#define PRODSIGNATURES_USBCAL1  _SFR_MEM8(0x001B)
+#define PRODSIGNATURES_USBRCOSC  _SFR_MEM8(0x001C)
+#define PRODSIGNATURES_USBRCOSCA  _SFR_MEM8(0x001D)
+#define PRODSIGNATURES_ADCACAL0  _SFR_MEM8(0x0020)
+#define PRODSIGNATURES_ADCACAL1  _SFR_MEM8(0x0021)
+#define PRODSIGNATURES_ADCBCAL0  _SFR_MEM8(0x0024)
+#define PRODSIGNATURES_ADCBCAL1  _SFR_MEM8(0x0025)
+#define PRODSIGNATURES_TEMPSENSE0  _SFR_MEM8(0x002E)
+#define PRODSIGNATURES_TEMPSENSE1  _SFR_MEM8(0x002F)
+#define PRODSIGNATURES_DACA0OFFCAL  _SFR_MEM8(0x0030)
+#define PRODSIGNATURES_DACA0GAINCAL  _SFR_MEM8(0x0031)
+#define PRODSIGNATURES_DACB0OFFCAL  _SFR_MEM8(0x0032)
+#define PRODSIGNATURES_DACB0GAINCAL  _SFR_MEM8(0x0033)
+#define PRODSIGNATURES_DACA1OFFCAL  _SFR_MEM8(0x0034)
+#define PRODSIGNATURES_DACA1GAINCAL  _SFR_MEM8(0x0035)
+#define PRODSIGNATURES_DACB1OFFCAL  _SFR_MEM8(0x0036)
+#define PRODSIGNATURES_DACB1GAINCAL  _SFR_MEM8(0x0037)
+
+/* VPORT - Virtual Port */
+#define VPORT0_DIR  _SFR_MEM8(0x0010)
+#define VPORT0_OUT  _SFR_MEM8(0x0011)
+#define VPORT0_IN  _SFR_MEM8(0x0012)
+#define VPORT0_INTFLAGS  _SFR_MEM8(0x0013)
+
+/* VPORT - Virtual Port */
+#define VPORT1_DIR  _SFR_MEM8(0x0014)
+#define VPORT1_OUT  _SFR_MEM8(0x0015)
+#define VPORT1_IN  _SFR_MEM8(0x0016)
+#define VPORT1_INTFLAGS  _SFR_MEM8(0x0017)
+
+/* VPORT - Virtual Port */
+#define VPORT2_DIR  _SFR_MEM8(0x0018)
+#define VPORT2_OUT  _SFR_MEM8(0x0019)
+#define VPORT2_IN  _SFR_MEM8(0x001A)
+#define VPORT2_INTFLAGS  _SFR_MEM8(0x001B)
+
+/* VPORT - Virtual Port */
+#define VPORT3_DIR  _SFR_MEM8(0x001C)
+#define VPORT3_OUT  _SFR_MEM8(0x001D)
+#define VPORT3_IN  _SFR_MEM8(0x001E)
+#define VPORT3_INTFLAGS  _SFR_MEM8(0x001F)
+
+/* OCD - On-Chip Debug System */
+#define OCD_OCDR0  _SFR_MEM8(0x002E)
+#define OCD_OCDR1  _SFR_MEM8(0x002F)
+
+/* CPU - CPU registers */
+#define CPU_CCP  _SFR_MEM8(0x0034)
+#define CPU_RAMPD  _SFR_MEM8(0x0038)
+#define CPU_RAMPX  _SFR_MEM8(0x0039)
+#define CPU_RAMPY  _SFR_MEM8(0x003A)
+#define CPU_RAMPZ  _SFR_MEM8(0x003B)
+#define CPU_EIND  _SFR_MEM8(0x003C)
+#define CPU_SPL  _SFR_MEM8(0x003D)
+#define CPU_SPH  _SFR_MEM8(0x003E)
+#define CPU_SREG  _SFR_MEM8(0x003F)
+
+/* CLK - Clock System */
+#define CLK_CTRL  _SFR_MEM8(0x0040)
+#define CLK_PSCTRL  _SFR_MEM8(0x0041)
+#define CLK_LOCK  _SFR_MEM8(0x0042)
+#define CLK_RTCCTRL  _SFR_MEM8(0x0043)
+#define CLK_USBCTRL  _SFR_MEM8(0x0044)
+
+/* SLEEP - Sleep Controller */
+#define SLEEP_CTRL  _SFR_MEM8(0x0048)
+
+/* OSC - Oscillator */
+#define OSC_CTRL  _SFR_MEM8(0x0050)
+#define OSC_STATUS  _SFR_MEM8(0x0051)
+#define OSC_XOSCCTRL  _SFR_MEM8(0x0052)
+#define OSC_XOSCFAIL  _SFR_MEM8(0x0053)
+#define OSC_RC32KCAL  _SFR_MEM8(0x0054)
+#define OSC_PLLCTRL  _SFR_MEM8(0x0055)
+#define OSC_DFLLCTRL  _SFR_MEM8(0x0056)
+
+/* DFLL - DFLL */
+#define DFLLRC32M_CTRL  _SFR_MEM8(0x0060)
+#define DFLLRC32M_CALA  _SFR_MEM8(0x0062)
+#define DFLLRC32M_CALB  _SFR_MEM8(0x0063)
+#define DFLLRC32M_COMP0  _SFR_MEM8(0x0064)
+#define DFLLRC32M_COMP1  _SFR_MEM8(0x0065)
+#define DFLLRC32M_COMP2  _SFR_MEM8(0x0066)
+
+/* DFLL - DFLL */
+#define DFLLRC2M_CTRL  _SFR_MEM8(0x0068)
+#define DFLLRC2M_CALA  _SFR_MEM8(0x006A)
+#define DFLLRC2M_CALB  _SFR_MEM8(0x006B)
+#define DFLLRC2M_COMP0  _SFR_MEM8(0x006C)
+#define DFLLRC2M_COMP1  _SFR_MEM8(0x006D)
+#define DFLLRC2M_COMP2  _SFR_MEM8(0x006E)
+
+/* PR - Power Reduction */
+#define PR_PRGEN  _SFR_MEM8(0x0070)
+#define PR_PRPA  _SFR_MEM8(0x0071)
+#define PR_PRPB  _SFR_MEM8(0x0072)
+#define PR_PRPC  _SFR_MEM8(0x0073)
+#define PR_PRPD  _SFR_MEM8(0x0074)
+#define PR_PRPE  _SFR_MEM8(0x0075)
+#define PR_PRPF  _SFR_MEM8(0x0076)
+
+/* RST - Reset */
+#define RST_STATUS  _SFR_MEM8(0x0078)
+#define RST_CTRL  _SFR_MEM8(0x0079)
+
+/* WDT - Watch-Dog Timer */
+#define WDT_CTRL  _SFR_MEM8(0x0080)
+#define WDT_WINCTRL  _SFR_MEM8(0x0081)
+#define WDT_STATUS  _SFR_MEM8(0x0082)
+
+/* MCU - MCU Control */
+#define MCU_DEVID0  _SFR_MEM8(0x0090)
+#define MCU_DEVID1  _SFR_MEM8(0x0091)
+#define MCU_DEVID2  _SFR_MEM8(0x0092)
+#define MCU_REVID  _SFR_MEM8(0x0093)
+#define MCU_JTAGUID  _SFR_MEM8(0x0094)
+#define MCU_MCUCR  _SFR_MEM8(0x0096)
+#define MCU_ANAINIT  _SFR_MEM8(0x0097)
+#define MCU_EVSYSLOCK  _SFR_MEM8(0x0098)
+#define MCU_AWEXLOCK  _SFR_MEM8(0x0099)
+
+/* PMIC - Programmable Multi-level Interrupt Controller */
+#define PMIC_STATUS  _SFR_MEM8(0x00A0)
+#define PMIC_INTPRI  _SFR_MEM8(0x00A1)
+#define PMIC_CTRL  _SFR_MEM8(0x00A2)
+
+/* PORTCFG - I/O port Configuration */
+#define PORTCFG_MPCMASK  _SFR_MEM8(0x00B0)
+#define PORTCFG_VPCTRLA  _SFR_MEM8(0x00B2)
+#define PORTCFG_VPCTRLB  _SFR_MEM8(0x00B3)
+#define PORTCFG_CLKEVOUT  _SFR_MEM8(0x00B4)
+#define PORTCFG_EBIOUT  _SFR_MEM8(0x00B5)
+#define PORTCFG_EVOUTSEL  _SFR_MEM8(0x00B6)
+
+/* AES - AES Module */
+#define AES_CTRL  _SFR_MEM8(0x00C0)
+#define AES_STATUS  _SFR_MEM8(0x00C1)
+#define AES_STATE  _SFR_MEM8(0x00C2)
+#define AES_KEY  _SFR_MEM8(0x00C3)
+#define AES_INTCTRL  _SFR_MEM8(0x00C4)
+
+/* CRC - Cyclic Redundancy Checker */
+#define CRC_CTRL  _SFR_MEM8(0x00D0)
+#define CRC_STATUS  _SFR_MEM8(0x00D1)
+#define CRC_DATAIN  _SFR_MEM8(0x00D3)
+#define CRC_CHECKSUM0  _SFR_MEM8(0x00D4)
+#define CRC_CHECKSUM1  _SFR_MEM8(0x00D5)
+#define CRC_CHECKSUM2  _SFR_MEM8(0x00D6)
+#define CRC_CHECKSUM3  _SFR_MEM8(0x00D7)
+
+/* DMA - DMA Controller */
+#define DMA_CTRL  _SFR_MEM8(0x0100)
+#define DMA_INTFLAGS  _SFR_MEM8(0x0103)
+#define DMA_STATUS  _SFR_MEM8(0x0104)
+#define DMA_TEMP  _SFR_MEM16(0x0106)
+#define DMA_CH0_CTRLA  _SFR_MEM8(0x0110)
+#define DMA_CH0_CTRLB  _SFR_MEM8(0x0111)
+#define DMA_CH0_ADDRCTRL  _SFR_MEM8(0x0112)
+#define DMA_CH0_TRIGSRC  _SFR_MEM8(0x0113)
+#define DMA_CH0_TRFCNT  _SFR_MEM16(0x0114)
+#define DMA_CH0_REPCNT  _SFR_MEM8(0x0116)
+#define DMA_CH0_SRCADDR0  _SFR_MEM8(0x0118)
+#define DMA_CH0_SRCADDR1  _SFR_MEM8(0x0119)
+#define DMA_CH0_SRCADDR2  _SFR_MEM8(0x011A)
+#define DMA_CH0_DESTADDR0  _SFR_MEM8(0x011C)
+#define DMA_CH0_DESTADDR1  _SFR_MEM8(0x011D)
+#define DMA_CH0_DESTADDR2  _SFR_MEM8(0x011E)
+#define DMA_CH1_CTRLA  _SFR_MEM8(0x0120)
+#define DMA_CH1_CTRLB  _SFR_MEM8(0x0121)
+#define DMA_CH1_ADDRCTRL  _SFR_MEM8(0x0122)
+#define DMA_CH1_TRIGSRC  _SFR_MEM8(0x0123)
+#define DMA_CH1_TRFCNT  _SFR_MEM16(0x0124)
+#define DMA_CH1_REPCNT  _SFR_MEM8(0x0126)
+#define DMA_CH1_SRCADDR0  _SFR_MEM8(0x0128)
+#define DMA_CH1_SRCADDR1  _SFR_MEM8(0x0129)
+#define DMA_CH1_SRCADDR2  _SFR_MEM8(0x012A)
+#define DMA_CH1_DESTADDR0  _SFR_MEM8(0x012C)
+#define DMA_CH1_DESTADDR1  _SFR_MEM8(0x012D)
+#define DMA_CH1_DESTADDR2  _SFR_MEM8(0x012E)
+#define DMA_CH2_CTRLA  _SFR_MEM8(0x0130)
+#define DMA_CH2_CTRLB  _SFR_MEM8(0x0131)
+#define DMA_CH2_ADDRCTRL  _SFR_MEM8(0x0132)
+#define DMA_CH2_TRIGSRC  _SFR_MEM8(0x0133)
+#define DMA_CH2_TRFCNT  _SFR_MEM16(0x0134)
+#define DMA_CH2_REPCNT  _SFR_MEM8(0x0136)
+#define DMA_CH2_SRCADDR0  _SFR_MEM8(0x0138)
+#define DMA_CH2_SRCADDR1  _SFR_MEM8(0x0139)
+#define DMA_CH2_SRCADDR2  _SFR_MEM8(0x013A)
+#define DMA_CH2_DESTADDR0  _SFR_MEM8(0x013C)
+#define DMA_CH2_DESTADDR1  _SFR_MEM8(0x013D)
+#define DMA_CH2_DESTADDR2  _SFR_MEM8(0x013E)
+#define DMA_CH3_CTRLA  _SFR_MEM8(0x0140)
+#define DMA_CH3_CTRLB  _SFR_MEM8(0x0141)
+#define DMA_CH3_ADDRCTRL  _SFR_MEM8(0x0142)
+#define DMA_CH3_TRIGSRC  _SFR_MEM8(0x0143)
+#define DMA_CH3_TRFCNT  _SFR_MEM16(0x0144)
+#define DMA_CH3_REPCNT  _SFR_MEM8(0x0146)
+#define DMA_CH3_SRCADDR0  _SFR_MEM8(0x0148)
+#define DMA_CH3_SRCADDR1  _SFR_MEM8(0x0149)
+#define DMA_CH3_SRCADDR2  _SFR_MEM8(0x014A)
+#define DMA_CH3_DESTADDR0  _SFR_MEM8(0x014C)
+#define DMA_CH3_DESTADDR1  _SFR_MEM8(0x014D)
+#define DMA_CH3_DESTADDR2  _SFR_MEM8(0x014E)
+
+/* EVSYS - Event System */
+#define EVSYS_CH0MUX  _SFR_MEM8(0x0180)
+#define EVSYS_CH1MUX  _SFR_MEM8(0x0181)
+#define EVSYS_CH2MUX  _SFR_MEM8(0x0182)
+#define EVSYS_CH3MUX  _SFR_MEM8(0x0183)
+#define EVSYS_CH4MUX  _SFR_MEM8(0x0184)
+#define EVSYS_CH5MUX  _SFR_MEM8(0x0185)
+#define EVSYS_CH6MUX  _SFR_MEM8(0x0186)
+#define EVSYS_CH7MUX  _SFR_MEM8(0x0187)
+#define EVSYS_CH0CTRL  _SFR_MEM8(0x0188)
+#define EVSYS_CH1CTRL  _SFR_MEM8(0x0189)
+#define EVSYS_CH2CTRL  _SFR_MEM8(0x018A)
+#define EVSYS_CH3CTRL  _SFR_MEM8(0x018B)
+#define EVSYS_CH4CTRL  _SFR_MEM8(0x018C)
+#define EVSYS_CH5CTRL  _SFR_MEM8(0x018D)
+#define EVSYS_CH6CTRL  _SFR_MEM8(0x018E)
+#define EVSYS_CH7CTRL  _SFR_MEM8(0x018F)
+#define EVSYS_STROBE  _SFR_MEM8(0x0190)
+#define EVSYS_DATA  _SFR_MEM8(0x0191)
+
+/* NVM - Non-volatile Memory Controller */
+#define NVM_ADDR0  _SFR_MEM8(0x01C0)
+#define NVM_ADDR1  _SFR_MEM8(0x01C1)
+#define NVM_ADDR2  _SFR_MEM8(0x01C2)
+#define NVM_DATA0  _SFR_MEM8(0x01C4)
+#define NVM_DATA1  _SFR_MEM8(0x01C5)
+#define NVM_DATA2  _SFR_MEM8(0x01C6)
+#define NVM_CMD  _SFR_MEM8(0x01CA)
+#define NVM_CTRLA  _SFR_MEM8(0x01CB)
+#define NVM_CTRLB  _SFR_MEM8(0x01CC)
+#define NVM_INTCTRL  _SFR_MEM8(0x01CD)
+#define NVM_STATUS  _SFR_MEM8(0x01CF)
+#define NVM_LOCKBITS  _SFR_MEM8(0x01D0)
+
+/* ADC - Analog-to-Digital Converter */
+#define ADCA_CTRLA  _SFR_MEM8(0x0200)
+#define ADCA_CTRLB  _SFR_MEM8(0x0201)
+#define ADCA_REFCTRL  _SFR_MEM8(0x0202)
+#define ADCA_EVCTRL  _SFR_MEM8(0x0203)
+#define ADCA_PRESCALER  _SFR_MEM8(0x0204)
+#define ADCA_INTFLAGS  _SFR_MEM8(0x0206)
+#define ADCA_TEMP  _SFR_MEM8(0x0207)
+#define ADCA_CAL  _SFR_MEM16(0x020C)
+#define ADCA_CH0RES  _SFR_MEM16(0x0210)
+#define ADCA_CH1RES  _SFR_MEM16(0x0212)
+#define ADCA_CH2RES  _SFR_MEM16(0x0214)
+#define ADCA_CH3RES  _SFR_MEM16(0x0216)
+#define ADCA_CMP  _SFR_MEM16(0x0218)
+#define ADCA_CH0_CTRL  _SFR_MEM8(0x0220)
+#define ADCA_CH0_MUXCTRL  _SFR_MEM8(0x0221)
+#define ADCA_CH0_INTCTRL  _SFR_MEM8(0x0222)
+#define ADCA_CH0_INTFLAGS  _SFR_MEM8(0x0223)
+#define ADCA_CH0_RES  _SFR_MEM16(0x0224)
+#define ADCA_CH0_SCAN  _SFR_MEM8(0x0226)
+#define ADCA_CH1_CTRL  _SFR_MEM8(0x0228)
+#define ADCA_CH1_MUXCTRL  _SFR_MEM8(0x0229)
+#define ADCA_CH1_INTCTRL  _SFR_MEM8(0x022A)
+#define ADCA_CH1_INTFLAGS  _SFR_MEM8(0x022B)
+#define ADCA_CH1_RES  _SFR_MEM16(0x022C)
+#define ADCA_CH1_SCAN  _SFR_MEM8(0x022E)
+#define ADCA_CH2_CTRL  _SFR_MEM8(0x0230)
+#define ADCA_CH2_MUXCTRL  _SFR_MEM8(0x0231)
+#define ADCA_CH2_INTCTRL  _SFR_MEM8(0x0232)
+#define ADCA_CH2_INTFLAGS  _SFR_MEM8(0x0233)
+#define ADCA_CH2_RES  _SFR_MEM16(0x0234)
+#define ADCA_CH2_SCAN  _SFR_MEM8(0x0236)
+#define ADCA_CH3_CTRL  _SFR_MEM8(0x0238)
+#define ADCA_CH3_MUXCTRL  _SFR_MEM8(0x0239)
+#define ADCA_CH3_INTCTRL  _SFR_MEM8(0x023A)
+#define ADCA_CH3_INTFLAGS  _SFR_MEM8(0x023B)
+#define ADCA_CH3_RES  _SFR_MEM16(0x023C)
+#define ADCA_CH3_SCAN  _SFR_MEM8(0x023E)
+
+/* ADC - Analog-to-Digital Converter */
+#define ADCB_CTRLA  _SFR_MEM8(0x0240)
+#define ADCB_CTRLB  _SFR_MEM8(0x0241)
+#define ADCB_REFCTRL  _SFR_MEM8(0x0242)
+#define ADCB_EVCTRL  _SFR_MEM8(0x0243)
+#define ADCB_PRESCALER  _SFR_MEM8(0x0244)
+#define ADCB_INTFLAGS  _SFR_MEM8(0x0246)
+#define ADCB_TEMP  _SFR_MEM8(0x0247)
+#define ADCB_CAL  _SFR_MEM16(0x024C)
+#define ADCB_CH0RES  _SFR_MEM16(0x0250)
+#define ADCB_CH1RES  _SFR_MEM16(0x0252)
+#define ADCB_CH2RES  _SFR_MEM16(0x0254)
+#define ADCB_CH3RES  _SFR_MEM16(0x0256)
+#define ADCB_CMP  _SFR_MEM16(0x0258)
+#define ADCB_CH0_CTRL  _SFR_MEM8(0x0260)
+#define ADCB_CH0_MUXCTRL  _SFR_MEM8(0x0261)
+#define ADCB_CH0_INTCTRL  _SFR_MEM8(0x0262)
+#define ADCB_CH0_INTFLAGS  _SFR_MEM8(0x0263)
+#define ADCB_CH0_RES  _SFR_MEM16(0x0264)
+#define ADCB_CH0_SCAN  _SFR_MEM8(0x0266)
+#define ADCB_CH1_CTRL  _SFR_MEM8(0x0268)
+#define ADCB_CH1_MUXCTRL  _SFR_MEM8(0x0269)
+#define ADCB_CH1_INTCTRL  _SFR_MEM8(0x026A)
+#define ADCB_CH1_INTFLAGS  _SFR_MEM8(0x026B)
+#define ADCB_CH1_RES  _SFR_MEM16(0x026C)
+#define ADCB_CH1_SCAN  _SFR_MEM8(0x026E)
+#define ADCB_CH2_CTRL  _SFR_MEM8(0x0270)
+#define ADCB_CH2_MUXCTRL  _SFR_MEM8(0x0271)
+#define ADCB_CH2_INTCTRL  _SFR_MEM8(0x0272)
+#define ADCB_CH2_INTFLAGS  _SFR_MEM8(0x0273)
+#define ADCB_CH2_RES  _SFR_MEM16(0x0274)
+#define ADCB_CH2_SCAN  _SFR_MEM8(0x0276)
+#define ADCB_CH3_CTRL  _SFR_MEM8(0x0278)
+#define ADCB_CH3_MUXCTRL  _SFR_MEM8(0x0279)
+#define ADCB_CH3_INTCTRL  _SFR_MEM8(0x027A)
+#define ADCB_CH3_INTFLAGS  _SFR_MEM8(0x027B)
+#define ADCB_CH3_RES  _SFR_MEM16(0x027C)
+#define ADCB_CH3_SCAN  _SFR_MEM8(0x027E)
+
+/* DAC - Digital-to-Analog Converter */
+#define DACB_CTRLA  _SFR_MEM8(0x0320)
+#define DACB_CTRLB  _SFR_MEM8(0x0321)
+#define DACB_CTRLC  _SFR_MEM8(0x0322)
+#define DACB_EVCTRL  _SFR_MEM8(0x0323)
+#define DACB_STATUS  _SFR_MEM8(0x0325)
+#define DACB_CH0GAINCAL  _SFR_MEM8(0x0328)
+#define DACB_CH0OFFSETCAL  _SFR_MEM8(0x0329)
+#define DACB_CH1GAINCAL  _SFR_MEM8(0x032A)
+#define DACB_CH1OFFSETCAL  _SFR_MEM8(0x032B)
+#define DACB_CH0DATA  _SFR_MEM16(0x0338)
+#define DACB_CH1DATA  _SFR_MEM16(0x033A)
+
+/* AC - Analog Comparator */
+#define ACA_AC0CTRL  _SFR_MEM8(0x0380)
+#define ACA_AC1CTRL  _SFR_MEM8(0x0381)
+#define ACA_AC0MUXCTRL  _SFR_MEM8(0x0382)
+#define ACA_AC1MUXCTRL  _SFR_MEM8(0x0383)
+#define ACA_CTRLA  _SFR_MEM8(0x0384)
+#define ACA_CTRLB  _SFR_MEM8(0x0385)
+#define ACA_WINCTRL  _SFR_MEM8(0x0386)
+#define ACA_STATUS  _SFR_MEM8(0x0387)
+
+/* AC - Analog Comparator */
+#define ACB_AC0CTRL  _SFR_MEM8(0x0390)
+#define ACB_AC1CTRL  _SFR_MEM8(0x0391)
+#define ACB_AC0MUXCTRL  _SFR_MEM8(0x0392)
+#define ACB_AC1MUXCTRL  _SFR_MEM8(0x0393)
+#define ACB_CTRLA  _SFR_MEM8(0x0394)
+#define ACB_CTRLB  _SFR_MEM8(0x0395)
+#define ACB_WINCTRL  _SFR_MEM8(0x0396)
+#define ACB_STATUS  _SFR_MEM8(0x0397)
+
+/* RTC - Real-Time Counter */
+#define RTC_CTRL  _SFR_MEM8(0x0400)
+#define RTC_STATUS  _SFR_MEM8(0x0401)
+#define RTC_INTCTRL  _SFR_MEM8(0x0402)
+#define RTC_INTFLAGS  _SFR_MEM8(0x0403)
+#define RTC_TEMP  _SFR_MEM8(0x0404)
+#define RTC_CNT  _SFR_MEM16(0x0408)
+#define RTC_PER  _SFR_MEM16(0x040A)
+#define RTC_COMP  _SFR_MEM16(0x040C)
+
+/* TWI - Two-Wire Interface */
+#define TWIC_CTRL  _SFR_MEM8(0x0480)
+#define TWIC_MASTER_CTRLA  _SFR_MEM8(0x0481)
+#define TWIC_MASTER_CTRLB  _SFR_MEM8(0x0482)
+#define TWIC_MASTER_CTRLC  _SFR_MEM8(0x0483)
+#define TWIC_MASTER_STATUS  _SFR_MEM8(0x0484)
+#define TWIC_MASTER_BAUD  _SFR_MEM8(0x0485)
+#define TWIC_MASTER_ADDR  _SFR_MEM8(0x0486)
+#define TWIC_MASTER_DATA  _SFR_MEM8(0x0487)
+#define TWIC_SLAVE_CTRLA  _SFR_MEM8(0x0488)
+#define TWIC_SLAVE_CTRLB  _SFR_MEM8(0x0489)
+#define TWIC_SLAVE_STATUS  _SFR_MEM8(0x048A)
+#define TWIC_SLAVE_ADDR  _SFR_MEM8(0x048B)
+#define TWIC_SLAVE_DATA  _SFR_MEM8(0x048C)
+#define TWIC_SLAVE_ADDRMASK  _SFR_MEM8(0x048D)
+
+/* TWI - Two-Wire Interface */
+#define TWIE_CTRL  _SFR_MEM8(0x04A0)
+#define TWIE_MASTER_CTRLA  _SFR_MEM8(0x04A1)
+#define TWIE_MASTER_CTRLB  _SFR_MEM8(0x04A2)
+#define TWIE_MASTER_CTRLC  _SFR_MEM8(0x04A3)
+#define TWIE_MASTER_STATUS  _SFR_MEM8(0x04A4)
+#define TWIE_MASTER_BAUD  _SFR_MEM8(0x04A5)
+#define TWIE_MASTER_ADDR  _SFR_MEM8(0x04A6)
+#define TWIE_MASTER_DATA  _SFR_MEM8(0x04A7)
+#define TWIE_SLAVE_CTRLA  _SFR_MEM8(0x04A8)
+#define TWIE_SLAVE_CTRLB  _SFR_MEM8(0x04A9)
+#define TWIE_SLAVE_STATUS  _SFR_MEM8(0x04AA)
+#define TWIE_SLAVE_ADDR  _SFR_MEM8(0x04AB)
+#define TWIE_SLAVE_DATA  _SFR_MEM8(0x04AC)
+#define TWIE_SLAVE_ADDRMASK  _SFR_MEM8(0x04AD)
+
+/* USB - Universal Serial Bus */
+#define USB_CTRLA  _SFR_MEM8(0x04C0)
+#define USB_CTRLB  _SFR_MEM8(0x04C1)
+#define USB_STATUS  _SFR_MEM8(0x04C2)
+#define USB_ADDR  _SFR_MEM8(0x04C3)
+#define USB_FIFOWP  _SFR_MEM8(0x04C4)
+#define USB_FIFORP  _SFR_MEM8(0x04C5)
+#define USB_EPPTR  _SFR_MEM16(0x04C6)
+#define USB_INTCTRLA  _SFR_MEM8(0x04C8)
+#define USB_INTCTRLB  _SFR_MEM8(0x04C9)
+#define USB_INTFLAGSACLR  _SFR_MEM8(0x04CA)
+#define USB_INTFLAGSASET  _SFR_MEM8(0x04CB)
+#define USB_INTFLAGSBCLR  _SFR_MEM8(0x04CC)
+#define USB_INTFLAGSBSET  _SFR_MEM8(0x04CD)
+#define USB_CAL0  _SFR_MEM8(0x04FA)
+#define USB_CAL1  _SFR_MEM8(0x04FB)
+
+/* PORT - I/O Ports */
+#define PORTA_DIR  _SFR_MEM8(0x0600)
+#define PORTA_DIRSET  _SFR_MEM8(0x0601)
+#define PORTA_DIRCLR  _SFR_MEM8(0x0602)
+#define PORTA_DIRTGL  _SFR_MEM8(0x0603)
+#define PORTA_OUT  _SFR_MEM8(0x0604)
+#define PORTA_OUTSET  _SFR_MEM8(0x0605)
+#define PORTA_OUTCLR  _SFR_MEM8(0x0606)
+#define PORTA_OUTTGL  _SFR_MEM8(0x0607)
+#define PORTA_IN  _SFR_MEM8(0x0608)
+#define PORTA_INTCTRL  _SFR_MEM8(0x0609)
+#define PORTA_INT0MASK  _SFR_MEM8(0x060A)
+#define PORTA_INT1MASK  _SFR_MEM8(0x060B)
+#define PORTA_INTFLAGS  _SFR_MEM8(0x060C)
+#define PORTA_REMAP  _SFR_MEM8(0x060E)
+#define PORTA_PIN0CTRL  _SFR_MEM8(0x0610)
+#define PORTA_PIN1CTRL  _SFR_MEM8(0x0611)
+#define PORTA_PIN2CTRL  _SFR_MEM8(0x0612)
+#define PORTA_PIN3CTRL  _SFR_MEM8(0x0613)
+#define PORTA_PIN4CTRL  _SFR_MEM8(0x0614)
+#define PORTA_PIN5CTRL  _SFR_MEM8(0x0615)
+#define PORTA_PIN6CTRL  _SFR_MEM8(0x0616)
+#define PORTA_PIN7CTRL  _SFR_MEM8(0x0617)
+
+/* PORT - I/O Ports */
+#define PORTB_DIR  _SFR_MEM8(0x0620)
+#define PORTB_DIRSET  _SFR_MEM8(0x0621)
+#define PORTB_DIRCLR  _SFR_MEM8(0x0622)
+#define PORTB_DIRTGL  _SFR_MEM8(0x0623)
+#define PORTB_OUT  _SFR_MEM8(0x0624)
+#define PORTB_OUTSET  _SFR_MEM8(0x0625)
+#define PORTB_OUTCLR  _SFR_MEM8(0x0626)
+#define PORTB_OUTTGL  _SFR_MEM8(0x0627)
+#define PORTB_IN  _SFR_MEM8(0x0628)
+#define PORTB_INTCTRL  _SFR_MEM8(0x0629)
+#define PORTB_INT0MASK  _SFR_MEM8(0x062A)
+#define PORTB_INT1MASK  _SFR_MEM8(0x062B)
+#define PORTB_INTFLAGS  _SFR_MEM8(0x062C)
+#define PORTB_REMAP  _SFR_MEM8(0x062E)
+#define PORTB_PIN0CTRL  _SFR_MEM8(0x0630)
+#define PORTB_PIN1CTRL  _SFR_MEM8(0x0631)
+#define PORTB_PIN2CTRL  _SFR_MEM8(0x0632)
+#define PORTB_PIN3CTRL  _SFR_MEM8(0x0633)
+#define PORTB_PIN4CTRL  _SFR_MEM8(0x0634)
+#define PORTB_PIN5CTRL  _SFR_MEM8(0x0635)
+#define PORTB_PIN6CTRL  _SFR_MEM8(0x0636)
+#define PORTB_PIN7CTRL  _SFR_MEM8(0x0637)
+
+/* PORT - I/O Ports */
+#define PORTC_DIR  _SFR_MEM8(0x0640)
+#define PORTC_DIRSET  _SFR_MEM8(0x0641)
+#define PORTC_DIRCLR  _SFR_MEM8(0x0642)
+#define PORTC_DIRTGL  _SFR_MEM8(0x0643)
+#define PORTC_OUT  _SFR_MEM8(0x0644)
+#define PORTC_OUTSET  _SFR_MEM8(0x0645)
+#define PORTC_OUTCLR  _SFR_MEM8(0x0646)
+#define PORTC_OUTTGL  _SFR_MEM8(0x0647)
+#define PORTC_IN  _SFR_MEM8(0x0648)
+#define PORTC_INTCTRL  _SFR_MEM8(0x0649)
+#define PORTC_INT0MASK  _SFR_MEM8(0x064A)
+#define PORTC_INT1MASK  _SFR_MEM8(0x064B)
+#define PORTC_INTFLAGS  _SFR_MEM8(0x064C)
+#define PORTC_REMAP  _SFR_MEM8(0x064E)
+#define PORTC_PIN0CTRL  _SFR_MEM8(0x0650)
+#define PORTC_PIN1CTRL  _SFR_MEM8(0x0651)
+#define PORTC_PIN2CTRL  _SFR_MEM8(0x0652)
+#define PORTC_PIN3CTRL  _SFR_MEM8(0x0653)
+#define PORTC_PIN4CTRL  _SFR_MEM8(0x0654)
+#define PORTC_PIN5CTRL  _SFR_MEM8(0x0655)
+#define PORTC_PIN6CTRL  _SFR_MEM8(0x0656)
+#define PORTC_PIN7CTRL  _SFR_MEM8(0x0657)
+
+/* PORT - I/O Ports */
+#define PORTD_DIR  _SFR_MEM8(0x0660)
+#define PORTD_DIRSET  _SFR_MEM8(0x0661)
+#define PORTD_DIRCLR  _SFR_MEM8(0x0662)
+#define PORTD_DIRTGL  _SFR_MEM8(0x0663)
+#define PORTD_OUT  _SFR_MEM8(0x0664)
+#define PORTD_OUTSET  _SFR_MEM8(0x0665)
+#define PORTD_OUTCLR  _SFR_MEM8(0x0666)
+#define PORTD_OUTTGL  _SFR_MEM8(0x0667)
+#define PORTD_IN  _SFR_MEM8(0x0668)
+#define PORTD_INTCTRL  _SFR_MEM8(0x0669)
+#define PORTD_INT0MASK  _SFR_MEM8(0x066A)
+#define PORTD_INT1MASK  _SFR_MEM8(0x066B)
+#define PORTD_INTFLAGS  _SFR_MEM8(0x066C)
+#define PORTD_REMAP  _SFR_MEM8(0x066E)
+#define PORTD_PIN0CTRL  _SFR_MEM8(0x0670)
+#define PORTD_PIN1CTRL  _SFR_MEM8(0x0671)
+#define PORTD_PIN2CTRL  _SFR_MEM8(0x0672)
+#define PORTD_PIN3CTRL  _SFR_MEM8(0x0673)
+#define PORTD_PIN4CTRL  _SFR_MEM8(0x0674)
+#define PORTD_PIN5CTRL  _SFR_MEM8(0x0675)
+#define PORTD_PIN6CTRL  _SFR_MEM8(0x0676)
+#define PORTD_PIN7CTRL  _SFR_MEM8(0x0677)
+
+/* PORT - I/O Ports */
+#define PORTE_DIR  _SFR_MEM8(0x0680)
+#define PORTE_DIRSET  _SFR_MEM8(0x0681)
+#define PORTE_DIRCLR  _SFR_MEM8(0x0682)
+#define PORTE_DIRTGL  _SFR_MEM8(0x0683)
+#define PORTE_OUT  _SFR_MEM8(0x0684)
+#define PORTE_OUTSET  _SFR_MEM8(0x0685)
+#define PORTE_OUTCLR  _SFR_MEM8(0x0686)
+#define PORTE_OUTTGL  _SFR_MEM8(0x0687)
+#define PORTE_IN  _SFR_MEM8(0x0688)
+#define PORTE_INTCTRL  _SFR_MEM8(0x0689)
+#define PORTE_INT0MASK  _SFR_MEM8(0x068A)
+#define PORTE_INT1MASK  _SFR_MEM8(0x068B)
+#define PORTE_INTFLAGS  _SFR_MEM8(0x068C)
+#define PORTE_REMAP  _SFR_MEM8(0x068E)
+#define PORTE_PIN0CTRL  _SFR_MEM8(0x0690)
+#define PORTE_PIN1CTRL  _SFR_MEM8(0x0691)
+#define PORTE_PIN2CTRL  _SFR_MEM8(0x0692)
+#define PORTE_PIN3CTRL  _SFR_MEM8(0x0693)
+#define PORTE_PIN4CTRL  _SFR_MEM8(0x0694)
+#define PORTE_PIN5CTRL  _SFR_MEM8(0x0695)
+#define PORTE_PIN6CTRL  _SFR_MEM8(0x0696)
+#define PORTE_PIN7CTRL  _SFR_MEM8(0x0697)
+
+/* PORT - I/O Ports */
+#define PORTF_DIR  _SFR_MEM8(0x06A0)
+#define PORTF_DIRSET  _SFR_MEM8(0x06A1)
+#define PORTF_DIRCLR  _SFR_MEM8(0x06A2)
+#define PORTF_DIRTGL  _SFR_MEM8(0x06A3)
+#define PORTF_OUT  _SFR_MEM8(0x06A4)
+#define PORTF_OUTSET  _SFR_MEM8(0x06A5)
+#define PORTF_OUTCLR  _SFR_MEM8(0x06A6)
+#define PORTF_OUTTGL  _SFR_MEM8(0x06A7)
+#define PORTF_IN  _SFR_MEM8(0x06A8)
+#define PORTF_INTCTRL  _SFR_MEM8(0x06A9)
+#define PORTF_INT0MASK  _SFR_MEM8(0x06AA)
+#define PORTF_INT1MASK  _SFR_MEM8(0x06AB)
+#define PORTF_INTFLAGS  _SFR_MEM8(0x06AC)
+#define PORTF_REMAP  _SFR_MEM8(0x06AE)
+#define PORTF_PIN0CTRL  _SFR_MEM8(0x06B0)
+#define PORTF_PIN1CTRL  _SFR_MEM8(0x06B1)
+#define PORTF_PIN2CTRL  _SFR_MEM8(0x06B2)
+#define PORTF_PIN3CTRL  _SFR_MEM8(0x06B3)
+#define PORTF_PIN4CTRL  _SFR_MEM8(0x06B4)
+#define PORTF_PIN5CTRL  _SFR_MEM8(0x06B5)
+#define PORTF_PIN6CTRL  _SFR_MEM8(0x06B6)
+#define PORTF_PIN7CTRL  _SFR_MEM8(0x06B7)
+
+/* PORT - I/O Ports */
+#define PORTR_DIR  _SFR_MEM8(0x07E0)
+#define PORTR_DIRSET  _SFR_MEM8(0x07E1)
+#define PORTR_DIRCLR  _SFR_MEM8(0x07E2)
+#define PORTR_DIRTGL  _SFR_MEM8(0x07E3)
+#define PORTR_OUT  _SFR_MEM8(0x07E4)
+#define PORTR_OUTSET  _SFR_MEM8(0x07E5)
+#define PORTR_OUTCLR  _SFR_MEM8(0x07E6)
+#define PORTR_OUTTGL  _SFR_MEM8(0x07E7)
+#define PORTR_IN  _SFR_MEM8(0x07E8)
+#define PORTR_INTCTRL  _SFR_MEM8(0x07E9)
+#define PORTR_INT0MASK  _SFR_MEM8(0x07EA)
+#define PORTR_INT1MASK  _SFR_MEM8(0x07EB)
+#define PORTR_INTFLAGS  _SFR_MEM8(0x07EC)
+#define PORTR_REMAP  _SFR_MEM8(0x07EE)
+#define PORTR_PIN0CTRL  _SFR_MEM8(0x07F0)
+#define PORTR_PIN1CTRL  _SFR_MEM8(0x07F1)
+#define PORTR_PIN2CTRL  _SFR_MEM8(0x07F2)
+#define PORTR_PIN3CTRL  _SFR_MEM8(0x07F3)
+#define PORTR_PIN4CTRL  _SFR_MEM8(0x07F4)
+#define PORTR_PIN5CTRL  _SFR_MEM8(0x07F5)
+#define PORTR_PIN6CTRL  _SFR_MEM8(0x07F6)
+#define PORTR_PIN7CTRL  _SFR_MEM8(0x07F7)
+
+/* TC0 - 16-bit Timer/Counter 0 */
+#define TCC0_CTRLA  _SFR_MEM8(0x0800)
+#define TCC0_CTRLB  _SFR_MEM8(0x0801)
+#define TCC0_CTRLC  _SFR_MEM8(0x0802)
+#define TCC0_CTRLD  _SFR_MEM8(0x0803)
+#define TCC0_CTRLE  _SFR_MEM8(0x0804)
+#define TCC0_INTCTRLA  _SFR_MEM8(0x0806)
+#define TCC0_INTCTRLB  _SFR_MEM8(0x0807)
+#define TCC0_CTRLFCLR  _SFR_MEM8(0x0808)
+#define TCC0_CTRLFSET  _SFR_MEM8(0x0809)
+#define TCC0_CTRLGCLR  _SFR_MEM8(0x080A)
+#define TCC0_CTRLGSET  _SFR_MEM8(0x080B)
+#define TCC0_INTFLAGS  _SFR_MEM8(0x080C)
+#define TCC0_TEMP  _SFR_MEM8(0x080F)
+#define TCC0_CNT  _SFR_MEM16(0x0820)
+#define TCC0_PER  _SFR_MEM16(0x0826)
+#define TCC0_CCA  _SFR_MEM16(0x0828)
+#define TCC0_CCB  _SFR_MEM16(0x082A)
+#define TCC0_CCC  _SFR_MEM16(0x082C)
+#define TCC0_CCD  _SFR_MEM16(0x082E)
+#define TCC0_PERBUF  _SFR_MEM16(0x0836)
+#define TCC0_CCABUF  _SFR_MEM16(0x0838)
+#define TCC0_CCBBUF  _SFR_MEM16(0x083A)
+#define TCC0_CCCBUF  _SFR_MEM16(0x083C)
+#define TCC0_CCDBUF  _SFR_MEM16(0x083E)
+
+/* TC2 - 16-bit Timer/Counter type 2 */
+#define TCC2_CTRLA  _SFR_MEM8(0x0800)
+#define TCC2_CTRLB  _SFR_MEM8(0x0801)
+#define TCC2_CTRLC  _SFR_MEM8(0x0802)
+#define TCC2_CTRLE  _SFR_MEM8(0x0804)
+#define TCC2_INTCTRLA  _SFR_MEM8(0x0806)
+#define TCC2_INTCTRLB  _SFR_MEM8(0x0807)
+#define TCC2_CTRLF  _SFR_MEM8(0x0809)
+#define TCC2_INTFLAGS  _SFR_MEM8(0x080C)
+#define TCC2_LCNT  _SFR_MEM8(0x0820)
+#define TCC2_HCNT  _SFR_MEM8(0x0821)
+#define TCC2_LPER  _SFR_MEM8(0x0826)
+#define TCC2_HPER  _SFR_MEM8(0x0827)
+#define TCC2_LCMPA  _SFR_MEM8(0x0828)
+#define TCC2_HCMPA  _SFR_MEM8(0x0829)
+#define TCC2_LCMPB  _SFR_MEM8(0x082A)
+#define TCC2_HCMPB  _SFR_MEM8(0x082B)
+#define TCC2_LCMPC  _SFR_MEM8(0x082C)
+#define TCC2_HCMPC  _SFR_MEM8(0x082D)
+#define TCC2_LCMPD  _SFR_MEM8(0x082E)
+#define TCC2_HCMPD  _SFR_MEM8(0x082F)
+
+/* TC1 - 16-bit Timer/Counter 1 */
+#define TCC1_CTRLA  _SFR_MEM8(0x0840)
+#define TCC1_CTRLB  _SFR_MEM8(0x0841)
+#define TCC1_CTRLC  _SFR_MEM8(0x0842)
+#define TCC1_CTRLD  _SFR_MEM8(0x0843)
+#define TCC1_CTRLE  _SFR_MEM8(0x0844)
+#define TCC1_INTCTRLA  _SFR_MEM8(0x0846)
+#define TCC1_INTCTRLB  _SFR_MEM8(0x0847)
+#define TCC1_CTRLFCLR  _SFR_MEM8(0x0848)
+#define TCC1_CTRLFSET  _SFR_MEM8(0x0849)
+#define TCC1_CTRLGCLR  _SFR_MEM8(0x084A)
+#define TCC1_CTRLGSET  _SFR_MEM8(0x084B)
+#define TCC1_INTFLAGS  _SFR_MEM8(0x084C)
+#define TCC1_TEMP  _SFR_MEM8(0x084F)
+#define TCC1_CNT  _SFR_MEM16(0x0860)
+#define TCC1_PER  _SFR_MEM16(0x0866)
+#define TCC1_CCA  _SFR_MEM16(0x0868)
+#define TCC1_CCB  _SFR_MEM16(0x086A)
+#define TCC1_PERBUF  _SFR_MEM16(0x0876)
+#define TCC1_CCABUF  _SFR_MEM16(0x0878)
+#define TCC1_CCBBUF  _SFR_MEM16(0x087A)
+
+/* AWEX - Advanced Waveform Extension */
+#define AWEXC_CTRL  _SFR_MEM8(0x0880)
+#define AWEXC_FDEMASK  _SFR_MEM8(0x0882)
+#define AWEXC_FDCTRL  _SFR_MEM8(0x0883)
+#define AWEXC_STATUS  _SFR_MEM8(0x0884)
+#define AWEXC_STATUSSET  _SFR_MEM8(0x0885)
+#define AWEXC_DTBOTH  _SFR_MEM8(0x0886)
+#define AWEXC_DTBOTHBUF  _SFR_MEM8(0x0887)
+#define AWEXC_DTLS  _SFR_MEM8(0x0888)
+#define AWEXC_DTHS  _SFR_MEM8(0x0889)
+#define AWEXC_DTLSBUF  _SFR_MEM8(0x088A)
+#define AWEXC_DTHSBUF  _SFR_MEM8(0x088B)
+#define AWEXC_OUTOVEN  _SFR_MEM8(0x088C)
+
+/* HIRES - High-Resolution Extension */
+#define HIRESC_CTRLA  _SFR_MEM8(0x0890)
+
+/* USART - Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTC0_DATA  _SFR_MEM8(0x08A0)
+#define USARTC0_STATUS  _SFR_MEM8(0x08A1)
+#define USARTC0_CTRLA  _SFR_MEM8(0x08A3)
+#define USARTC0_CTRLB  _SFR_MEM8(0x08A4)
+#define USARTC0_CTRLC  _SFR_MEM8(0x08A5)
+#define USARTC0_BAUDCTRLA  _SFR_MEM8(0x08A6)
+#define USARTC0_BAUDCTRLB  _SFR_MEM8(0x08A7)
+
+/* USART - Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTC1_DATA  _SFR_MEM8(0x08B0)
+#define USARTC1_STATUS  _SFR_MEM8(0x08B1)
+#define USARTC1_CTRLA  _SFR_MEM8(0x08B3)
+#define USARTC1_CTRLB  _SFR_MEM8(0x08B4)
+#define USARTC1_CTRLC  _SFR_MEM8(0x08B5)
+#define USARTC1_BAUDCTRLA  _SFR_MEM8(0x08B6)
+#define USARTC1_BAUDCTRLB  _SFR_MEM8(0x08B7)
+
+/* SPI - Serial Peripheral Interface */
+#define SPIC_CTRL  _SFR_MEM8(0x08C0)
+#define SPIC_INTCTRL  _SFR_MEM8(0x08C1)
+#define SPIC_STATUS  _SFR_MEM8(0x08C2)
+#define SPIC_DATA  _SFR_MEM8(0x08C3)
+
+/* IRCOM - IR Communication Module */
+#define IRCOM_CTRL  _SFR_MEM8(0x08F8)
+#define IRCOM_TXPLCTRL  _SFR_MEM8(0x08F9)
+#define IRCOM_RXPLCTRL  _SFR_MEM8(0x08FA)
+
+/* TC0 - 16-bit Timer/Counter 0 */
+#define TCD0_CTRLA  _SFR_MEM8(0x0900)
+#define TCD0_CTRLB  _SFR_MEM8(0x0901)
+#define TCD0_CTRLC  _SFR_MEM8(0x0902)
+#define TCD0_CTRLD  _SFR_MEM8(0x0903)
+#define TCD0_CTRLE  _SFR_MEM8(0x0904)
+#define TCD0_INTCTRLA  _SFR_MEM8(0x0906)
+#define TCD0_INTCTRLB  _SFR_MEM8(0x0907)
+#define TCD0_CTRLFCLR  _SFR_MEM8(0x0908)
+#define TCD0_CTRLFSET  _SFR_MEM8(0x0909)
+#define TCD0_CTRLGCLR  _SFR_MEM8(0x090A)
+#define TCD0_CTRLGSET  _SFR_MEM8(0x090B)
+#define TCD0_INTFLAGS  _SFR_MEM8(0x090C)
+#define TCD0_TEMP  _SFR_MEM8(0x090F)
+#define TCD0_CNT  _SFR_MEM16(0x0920)
+#define TCD0_PER  _SFR_MEM16(0x0926)
+#define TCD0_CCA  _SFR_MEM16(0x0928)
+#define TCD0_CCB  _SFR_MEM16(0x092A)
+#define TCD0_CCC  _SFR_MEM16(0x092C)
+#define TCD0_CCD  _SFR_MEM16(0x092E)
+#define TCD0_PERBUF  _SFR_MEM16(0x0936)
+#define TCD0_CCABUF  _SFR_MEM16(0x0938)
+#define TCD0_CCBBUF  _SFR_MEM16(0x093A)
+#define TCD0_CCCBUF  _SFR_MEM16(0x093C)
+#define TCD0_CCDBUF  _SFR_MEM16(0x093E)
+
+/* TC2 - 16-bit Timer/Counter type 2 */
+#define TCD2_CTRLA  _SFR_MEM8(0x0900)
+#define TCD2_CTRLB  _SFR_MEM8(0x0901)
+#define TCD2_CTRLC  _SFR_MEM8(0x0902)
+#define TCD2_CTRLE  _SFR_MEM8(0x0904)
+#define TCD2_INTCTRLA  _SFR_MEM8(0x0906)
+#define TCD2_INTCTRLB  _SFR_MEM8(0x0907)
+#define TCD2_CTRLF  _SFR_MEM8(0x0909)
+#define TCD2_INTFLAGS  _SFR_MEM8(0x090C)
+#define TCD2_LCNT  _SFR_MEM8(0x0920)
+#define TCD2_HCNT  _SFR_MEM8(0x0921)
+#define TCD2_LPER  _SFR_MEM8(0x0926)
+#define TCD2_HPER  _SFR_MEM8(0x0927)
+#define TCD2_LCMPA  _SFR_MEM8(0x0928)
+#define TCD2_HCMPA  _SFR_MEM8(0x0929)
+#define TCD2_LCMPB  _SFR_MEM8(0x092A)
+#define TCD2_HCMPB  _SFR_MEM8(0x092B)
+#define TCD2_LCMPC  _SFR_MEM8(0x092C)
+#define TCD2_HCMPC  _SFR_MEM8(0x092D)
+#define TCD2_LCMPD  _SFR_MEM8(0x092E)
+#define TCD2_HCMPD  _SFR_MEM8(0x092F)
+
+/* TC1 - 16-bit Timer/Counter 1 */
+#define TCD1_CTRLA  _SFR_MEM8(0x0940)
+#define TCD1_CTRLB  _SFR_MEM8(0x0941)
+#define TCD1_CTRLC  _SFR_MEM8(0x0942)
+#define TCD1_CTRLD  _SFR_MEM8(0x0943)
+#define TCD1_CTRLE  _SFR_MEM8(0x0944)
+#define TCD1_INTCTRLA  _SFR_MEM8(0x0946)
+#define TCD1_INTCTRLB  _SFR_MEM8(0x0947)
+#define TCD1_CTRLFCLR  _SFR_MEM8(0x0948)
+#define TCD1_CTRLFSET  _SFR_MEM8(0x0949)
+#define TCD1_CTRLGCLR  _SFR_MEM8(0x094A)
+#define TCD1_CTRLGSET  _SFR_MEM8(0x094B)
+#define TCD1_INTFLAGS  _SFR_MEM8(0x094C)
+#define TCD1_TEMP  _SFR_MEM8(0x094F)
+#define TCD1_CNT  _SFR_MEM16(0x0960)
+#define TCD1_PER  _SFR_MEM16(0x0966)
+#define TCD1_CCA  _SFR_MEM16(0x0968)
+#define TCD1_CCB  _SFR_MEM16(0x096A)
+#define TCD1_PERBUF  _SFR_MEM16(0x0976)
+#define TCD1_CCABUF  _SFR_MEM16(0x0978)
+#define TCD1_CCBBUF  _SFR_MEM16(0x097A)
+
+/* HIRES - High-Resolution Extension */
+#define HIRESD_CTRLA  _SFR_MEM8(0x0990)
+
+/* USART - Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTD0_DATA  _SFR_MEM8(0x09A0)
+#define USARTD0_STATUS  _SFR_MEM8(0x09A1)
+#define USARTD0_CTRLA  _SFR_MEM8(0x09A3)
+#define USARTD0_CTRLB  _SFR_MEM8(0x09A4)
+#define USARTD0_CTRLC  _SFR_MEM8(0x09A5)
+#define USARTD0_BAUDCTRLA  _SFR_MEM8(0x09A6)
+#define USARTD0_BAUDCTRLB  _SFR_MEM8(0x09A7)
+
+/* USART - Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTD1_DATA  _SFR_MEM8(0x09B0)
+#define USARTD1_STATUS  _SFR_MEM8(0x09B1)
+#define USARTD1_CTRLA  _SFR_MEM8(0x09B3)
+#define USARTD1_CTRLB  _SFR_MEM8(0x09B4)
+#define USARTD1_CTRLC  _SFR_MEM8(0x09B5)
+#define USARTD1_BAUDCTRLA  _SFR_MEM8(0x09B6)
+#define USARTD1_BAUDCTRLB  _SFR_MEM8(0x09B7)
+
+/* SPI - Serial Peripheral Interface */
+#define SPID_CTRL  _SFR_MEM8(0x09C0)
+#define SPID_INTCTRL  _SFR_MEM8(0x09C1)
+#define SPID_STATUS  _SFR_MEM8(0x09C2)
+#define SPID_DATA  _SFR_MEM8(0x09C3)
+
+/* TC0 - 16-bit Timer/Counter 0 */
+#define TCE0_CTRLA  _SFR_MEM8(0x0A00)
+#define TCE0_CTRLB  _SFR_MEM8(0x0A01)
+#define TCE0_CTRLC  _SFR_MEM8(0x0A02)
+#define TCE0_CTRLD  _SFR_MEM8(0x0A03)
+#define TCE0_CTRLE  _SFR_MEM8(0x0A04)
+#define TCE0_INTCTRLA  _SFR_MEM8(0x0A06)
+#define TCE0_INTCTRLB  _SFR_MEM8(0x0A07)
+#define TCE0_CTRLFCLR  _SFR_MEM8(0x0A08)
+#define TCE0_CTRLFSET  _SFR_MEM8(0x0A09)
+#define TCE0_CTRLGCLR  _SFR_MEM8(0x0A0A)
+#define TCE0_CTRLGSET  _SFR_MEM8(0x0A0B)
+#define TCE0_INTFLAGS  _SFR_MEM8(0x0A0C)
+#define TCE0_TEMP  _SFR_MEM8(0x0A0F)
+#define TCE0_CNT  _SFR_MEM16(0x0A20)
+#define TCE0_PER  _SFR_MEM16(0x0A26)
+#define TCE0_CCA  _SFR_MEM16(0x0A28)
+#define TCE0_CCB  _SFR_MEM16(0x0A2A)
+#define TCE0_CCC  _SFR_MEM16(0x0A2C)
+#define TCE0_CCD  _SFR_MEM16(0x0A2E)
+#define TCE0_PERBUF  _SFR_MEM16(0x0A36)
+#define TCE0_CCABUF  _SFR_MEM16(0x0A38)
+#define TCE0_CCBBUF  _SFR_MEM16(0x0A3A)
+#define TCE0_CCCBUF  _SFR_MEM16(0x0A3C)
+#define TCE0_CCDBUF  _SFR_MEM16(0x0A3E)
+
+/* TC2 - 16-bit Timer/Counter type 2 */
+#define TCE2_CTRLA  _SFR_MEM8(0x0A00)
+#define TCE2_CTRLB  _SFR_MEM8(0x0A01)
+#define TCE2_CTRLC  _SFR_MEM8(0x0A02)
+#define TCE2_CTRLE  _SFR_MEM8(0x0A04)
+#define TCE2_INTCTRLA  _SFR_MEM8(0x0A06)
+#define TCE2_INTCTRLB  _SFR_MEM8(0x0A07)
+#define TCE2_CTRLF  _SFR_MEM8(0x0A09)
+#define TCE2_INTFLAGS  _SFR_MEM8(0x0A0C)
+#define TCE2_LCNT  _SFR_MEM8(0x0A20)
+#define TCE2_HCNT  _SFR_MEM8(0x0A21)
+#define TCE2_LPER  _SFR_MEM8(0x0A26)
+#define TCE2_HPER  _SFR_MEM8(0x0A27)
+#define TCE2_LCMPA  _SFR_MEM8(0x0A28)
+#define TCE2_HCMPA  _SFR_MEM8(0x0A29)
+#define TCE2_LCMPB  _SFR_MEM8(0x0A2A)
+#define TCE2_HCMPB  _SFR_MEM8(0x0A2B)
+#define TCE2_LCMPC  _SFR_MEM8(0x0A2C)
+#define TCE2_HCMPC  _SFR_MEM8(0x0A2D)
+#define TCE2_LCMPD  _SFR_MEM8(0x0A2E)
+#define TCE2_HCMPD  _SFR_MEM8(0x0A2F)
+
+/* TC1 - 16-bit Timer/Counter 1 */
+#define TCE1_CTRLA  _SFR_MEM8(0x0A40)
+#define TCE1_CTRLB  _SFR_MEM8(0x0A41)
+#define TCE1_CTRLC  _SFR_MEM8(0x0A42)
+#define TCE1_CTRLD  _SFR_MEM8(0x0A43)
+#define TCE1_CTRLE  _SFR_MEM8(0x0A44)
+#define TCE1_INTCTRLA  _SFR_MEM8(0x0A46)
+#define TCE1_INTCTRLB  _SFR_MEM8(0x0A47)
+#define TCE1_CTRLFCLR  _SFR_MEM8(0x0A48)
+#define TCE1_CTRLFSET  _SFR_MEM8(0x0A49)
+#define TCE1_CTRLGCLR  _SFR_MEM8(0x0A4A)
+#define TCE1_CTRLGSET  _SFR_MEM8(0x0A4B)
+#define TCE1_INTFLAGS  _SFR_MEM8(0x0A4C)
+#define TCE1_TEMP  _SFR_MEM8(0x0A4F)
+#define TCE1_CNT  _SFR_MEM16(0x0A60)
+#define TCE1_PER  _SFR_MEM16(0x0A66)
+#define TCE1_CCA  _SFR_MEM16(0x0A68)
+#define TCE1_CCB  _SFR_MEM16(0x0A6A)
+#define TCE1_PERBUF  _SFR_MEM16(0x0A76)
+#define TCE1_CCABUF  _SFR_MEM16(0x0A78)
+#define TCE1_CCBBUF  _SFR_MEM16(0x0A7A)
+
+/* AWEX - Advanced Waveform Extension */
+#define AWEXE_CTRL  _SFR_MEM8(0x0A80)
+#define AWEXE_FDEMASK  _SFR_MEM8(0x0A82)
+#define AWEXE_FDCTRL  _SFR_MEM8(0x0A83)
+#define AWEXE_STATUS  _SFR_MEM8(0x0A84)
+#define AWEXE_STATUSSET  _SFR_MEM8(0x0A85)
+#define AWEXE_DTBOTH  _SFR_MEM8(0x0A86)
+#define AWEXE_DTBOTHBUF  _SFR_MEM8(0x0A87)
+#define AWEXE_DTLS  _SFR_MEM8(0x0A88)
+#define AWEXE_DTHS  _SFR_MEM8(0x0A89)
+#define AWEXE_DTLSBUF  _SFR_MEM8(0x0A8A)
+#define AWEXE_DTHSBUF  _SFR_MEM8(0x0A8B)
+#define AWEXE_OUTOVEN  _SFR_MEM8(0x0A8C)
+
+/* HIRES - High-Resolution Extension */
+#define HIRESE_CTRLA  _SFR_MEM8(0x0A90)
+
+/* USART - Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTE0_DATA  _SFR_MEM8(0x0AA0)
+#define USARTE0_STATUS  _SFR_MEM8(0x0AA1)
+#define USARTE0_CTRLA  _SFR_MEM8(0x0AA3)
+#define USARTE0_CTRLB  _SFR_MEM8(0x0AA4)
+#define USARTE0_CTRLC  _SFR_MEM8(0x0AA5)
+#define USARTE0_BAUDCTRLA  _SFR_MEM8(0x0AA6)
+#define USARTE0_BAUDCTRLB  _SFR_MEM8(0x0AA7)
+
+/* USART - Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTE1_DATA  _SFR_MEM8(0x0AB0)
+#define USARTE1_STATUS  _SFR_MEM8(0x0AB1)
+#define USARTE1_CTRLA  _SFR_MEM8(0x0AB3)
+#define USARTE1_CTRLB  _SFR_MEM8(0x0AB4)
+#define USARTE1_CTRLC  _SFR_MEM8(0x0AB5)
+#define USARTE1_BAUDCTRLA  _SFR_MEM8(0x0AB6)
+#define USARTE1_BAUDCTRLB  _SFR_MEM8(0x0AB7)
+
+/* SPI - Serial Peripheral Interface */
+#define SPIE_CTRL  _SFR_MEM8(0x0AC0)
+#define SPIE_INTCTRL  _SFR_MEM8(0x0AC1)
+#define SPIE_STATUS  _SFR_MEM8(0x0AC2)
+#define SPIE_DATA  _SFR_MEM8(0x0AC3)
+
+/* TC0 - 16-bit Timer/Counter 0 */
+#define TCF0_CTRLA  _SFR_MEM8(0x0B00)
+#define TCF0_CTRLB  _SFR_MEM8(0x0B01)
+#define TCF0_CTRLC  _SFR_MEM8(0x0B02)
+#define TCF0_CTRLD  _SFR_MEM8(0x0B03)
+#define TCF0_CTRLE  _SFR_MEM8(0x0B04)
+#define TCF0_INTCTRLA  _SFR_MEM8(0x0B06)
+#define TCF0_INTCTRLB  _SFR_MEM8(0x0B07)
+#define TCF0_CTRLFCLR  _SFR_MEM8(0x0B08)
+#define TCF0_CTRLFSET  _SFR_MEM8(0x0B09)
+#define TCF0_CTRLGCLR  _SFR_MEM8(0x0B0A)
+#define TCF0_CTRLGSET  _SFR_MEM8(0x0B0B)
+#define TCF0_INTFLAGS  _SFR_MEM8(0x0B0C)
+#define TCF0_TEMP  _SFR_MEM8(0x0B0F)
+#define TCF0_CNT  _SFR_MEM16(0x0B20)
+#define TCF0_PER  _SFR_MEM16(0x0B26)
+#define TCF0_CCA  _SFR_MEM16(0x0B28)
+#define TCF0_CCB  _SFR_MEM16(0x0B2A)
+#define TCF0_CCC  _SFR_MEM16(0x0B2C)
+#define TCF0_CCD  _SFR_MEM16(0x0B2E)
+#define TCF0_PERBUF  _SFR_MEM16(0x0B36)
+#define TCF0_CCABUF  _SFR_MEM16(0x0B38)
+#define TCF0_CCBBUF  _SFR_MEM16(0x0B3A)
+#define TCF0_CCCBUF  _SFR_MEM16(0x0B3C)
+#define TCF0_CCDBUF  _SFR_MEM16(0x0B3E)
+
+/* TC2 - 16-bit Timer/Counter type 2 */
+#define TCF2_CTRLA  _SFR_MEM8(0x0B00)
+#define TCF2_CTRLB  _SFR_MEM8(0x0B01)
+#define TCF2_CTRLC  _SFR_MEM8(0x0B02)
+#define TCF2_CTRLE  _SFR_MEM8(0x0B04)
+#define TCF2_INTCTRLA  _SFR_MEM8(0x0B06)
+#define TCF2_INTCTRLB  _SFR_MEM8(0x0B07)
+#define TCF2_CTRLF  _SFR_MEM8(0x0B09)
+#define TCF2_INTFLAGS  _SFR_MEM8(0x0B0C)
+#define TCF2_LCNT  _SFR_MEM8(0x0B20)
+#define TCF2_HCNT  _SFR_MEM8(0x0B21)
+#define TCF2_LPER  _SFR_MEM8(0x0B26)
+#define TCF2_HPER  _SFR_MEM8(0x0B27)
+#define TCF2_LCMPA  _SFR_MEM8(0x0B28)
+#define TCF2_HCMPA  _SFR_MEM8(0x0B29)
+#define TCF2_LCMPB  _SFR_MEM8(0x0B2A)
+#define TCF2_HCMPB  _SFR_MEM8(0x0B2B)
+#define TCF2_LCMPC  _SFR_MEM8(0x0B2C)
+#define TCF2_HCMPC  _SFR_MEM8(0x0B2D)
+#define TCF2_LCMPD  _SFR_MEM8(0x0B2E)
+#define TCF2_HCMPD  _SFR_MEM8(0x0B2F)
+
+/* HIRES - High-Resolution Extension */
+#define HIRESF_CTRLA  _SFR_MEM8(0x0B90)
+
+/* USART - Universal Synchronous/Asynchronous Receiver/Transmitter */
+#define USARTF0_DATA  _SFR_MEM8(0x0BA0)
+#define USARTF0_STATUS  _SFR_MEM8(0x0BA1)
+#define USARTF0_CTRLA  _SFR_MEM8(0x0BA3)
+#define USARTF0_CTRLB  _SFR_MEM8(0x0BA4)
+#define USARTF0_CTRLC  _SFR_MEM8(0x0BA5)
+#define USARTF0_BAUDCTRLA  _SFR_MEM8(0x0BA6)
+#define USARTF0_BAUDCTRLB  _SFR_MEM8(0x0BA7)
+
+
+
+/*================== Bitfield Definitions ================== */
+
+/* VPORT - Virtual Ports */
+/* VPORT.INTFLAGS  bit masks and bit positions */
+#define VPORT_INT1IF_bm  0x02  /* Port Interrupt 1 Flag bit mask. */
+#define VPORT_INT1IF_bp  1  /* Port Interrupt 1 Flag bit position. */
+
+#define VPORT_INT0IF_bm  0x01  /* Port Interrupt 0 Flag bit mask. */
+#define VPORT_INT0IF_bp  0  /* Port Interrupt 0 Flag bit position. */
+
+/* XOCD - On-Chip Debug System */
+/* OCD.OCDR0  bit masks and bit positions */
+#define OCD_OCDRD_gm  0xFF  /* OCDR Dirty group mask. */
+#define OCD_OCDRD_gp  0  /* OCDR Dirty group position. */
+#define OCD_OCDRD0_bm  (1<<0)  /* OCDR Dirty bit 0 mask. */
+#define OCD_OCDRD0_bp  0  /* OCDR Dirty bit 0 position. */
+#define OCD_OCDRD1_bm  (1<<1)  /* OCDR Dirty bit 1 mask. */
+#define OCD_OCDRD1_bp  1  /* OCDR Dirty bit 1 position. */
+#define OCD_OCDRD2_bm  (1<<2)  /* OCDR Dirty bit 2 mask. */
+#define OCD_OCDRD2_bp  2  /* OCDR Dirty bit 2 position. */
+#define OCD_OCDRD3_bm  (1<<3)  /* OCDR Dirty bit 3 mask. */
+#define OCD_OCDRD3_bp  3  /* OCDR Dirty bit 3 position. */
+#define OCD_OCDRD4_bm  (1<<4)  /* OCDR Dirty bit 4 mask. */
+#define OCD_OCDRD4_bp  4  /* OCDR Dirty bit 4 position. */
+#define OCD_OCDRD5_bm  (1<<5)  /* OCDR Dirty bit 5 mask. */
+#define OCD_OCDRD5_bp  5  /* OCDR Dirty bit 5 position. */
+#define OCD_OCDRD6_bm  (1<<6)  /* OCDR Dirty bit 6 mask. */
+#define OCD_OCDRD6_bp  6  /* OCDR Dirty bit 6 position. */
+#define OCD_OCDRD7_bm  (1<<7)  /* OCDR Dirty bit 7 mask. */
+#define OCD_OCDRD7_bp  7  /* OCDR Dirty bit 7 position. */
+
+/* OCD.OCDR1  bit masks and bit positions */
+/* OCD_OCDRD  Predefined. */
+/* OCD_OCDRD  Predefined. */
+
+/* CPU - CPU */
+/* CPU.CCP  bit masks and bit positions */
+#define CPU_CCP_gm  0xFF  /* CCP signature group mask. */
+#define CPU_CCP_gp  0  /* CCP signature group position. */
+#define CPU_CCP0_bm  (1<<0)  /* CCP signature bit 0 mask. */
+#define CPU_CCP0_bp  0  /* CCP signature bit 0 position. */
+#define CPU_CCP1_bm  (1<<1)  /* CCP signature bit 1 mask. */
+#define CPU_CCP1_bp  1  /* CCP signature bit 1 position. */
+#define CPU_CCP2_bm  (1<<2)  /* CCP signature bit 2 mask. */
+#define CPU_CCP2_bp  2  /* CCP signature bit 2 position. */
+#define CPU_CCP3_bm  (1<<3)  /* CCP signature bit 3 mask. */
+#define CPU_CCP3_bp  3  /* CCP signature bit 3 position. */
+#define CPU_CCP4_bm  (1<<4)  /* CCP signature bit 4 mask. */
+#define CPU_CCP4_bp  4  /* CCP signature bit 4 position. */
+#define CPU_CCP5_bm  (1<<5)  /* CCP signature bit 5 mask. */
+#define CPU_CCP5_bp  5  /* CCP signature bit 5 position. */
+#define CPU_CCP6_bm  (1<<6)  /* CCP signature bit 6 mask. */
+#define CPU_CCP6_bp  6  /* CCP signature bit 6 position. */
+#define CPU_CCP7_bm  (1<<7)  /* CCP signature bit 7 mask. */
+#define CPU_CCP7_bp  7  /* CCP signature bit 7 position. */
+
+/* CPU.SREG  bit masks and bit positions */
+#define CPU_I_bm  0x80  /* Global Interrupt Enable Flag bit mask. */
+#define CPU_I_bp  7  /* Global Interrupt Enable Flag bit position. */
+
+#define CPU_T_bm  0x40  /* Transfer Bit bit mask. */
+#define CPU_T_bp  6  /* Transfer Bit bit position. */
+
+#define CPU_H_bm  0x20  /* Half Carry Flag bit mask. */
+#define CPU_H_bp  5  /* Half Carry Flag bit position. */
+
+#define CPU_S_bm  0x10  /* N Exclusive Or V Flag bit mask. */
+#define CPU_S_bp  4  /* N Exclusive Or V Flag bit position. */
+
+#define CPU_V_bm  0x08  /* Two's Complement Overflow Flag bit mask. */
+#define CPU_V_bp  3  /* Two's Complement Overflow Flag bit position. */
+
+#define CPU_N_bm  0x04  /* Negative Flag bit mask. */
+#define CPU_N_bp  2  /* Negative Flag bit position. */
+
+#define CPU_Z_bm  0x02  /* Zero Flag bit mask. */
+#define CPU_Z_bp  1  /* Zero Flag bit position. */
+
+#define CPU_C_bm  0x01  /* Carry Flag bit mask. */
+#define CPU_C_bp  0  /* Carry Flag bit position. */
+
+/* CLK - Clock System */
+/* CLK.CTRL  bit masks and bit positions */
+#define CLK_SCLKSEL_gm  0x07  /* System Clock Selection group mask. */
+#define CLK_SCLKSEL_gp  0  /* System Clock Selection group position. */
+#define CLK_SCLKSEL0_bm  (1<<0)  /* System Clock Selection bit 0 mask. */
+#define CLK_SCLKSEL0_bp  0  /* System Clock Selection bit 0 position. */
+#define CLK_SCLKSEL1_bm  (1<<1)  /* System Clock Selection bit 1 mask. */
+#define CLK_SCLKSEL1_bp  1  /* System Clock Selection bit 1 position. */
+#define CLK_SCLKSEL2_bm  (1<<2)  /* System Clock Selection bit 2 mask. */
+#define CLK_SCLKSEL2_bp  2  /* System Clock Selection bit 2 position. */
+
+/* CLK.PSCTRL  bit masks and bit positions */
+#define CLK_PSADIV_gm  0x7C  /* Prescaler A Division Factor group mask. */
+#define CLK_PSADIV_gp  2  /* Prescaler A Division Factor group position. */
+#define CLK_PSADIV0_bm  (1<<2)  /* Prescaler A Division Factor bit 0 mask. */
+#define CLK_PSADIV0_bp  2  /* Prescaler A Division Factor bit 0 position. */
+#define CLK_PSADIV1_bm  (1<<3)  /* Prescaler A Division Factor bit 1 mask. */
+#define CLK_PSADIV1_bp  3  /* Prescaler A Division Factor bit 1 position. */
+#define CLK_PSADIV2_bm  (1<<4)  /* Prescaler A Division Factor bit 2 mask. */
+#define CLK_PSADIV2_bp  4  /* Prescaler A Division Factor bit 2 position. */
+#define CLK_PSADIV3_bm  (1<<5)  /* Prescaler A Division Factor bit 3 mask. */
+#define CLK_PSADIV3_bp  5  /* Prescaler A Division Factor bit 3 position. */
+#define CLK_PSADIV4_bm  (1<<6)  /* Prescaler A Division Factor bit 4 mask. */
+#define CLK_PSADIV4_bp  6  /* Prescaler A Division Factor bit 4 position. */
+
+#define CLK_PSBCDIV_gm  0x03  /* Prescaler B and C Division factor group mask. */
+#define CLK_PSBCDIV_gp  0  /* Prescaler B and C Division factor group position. */
+#define CLK_PSBCDIV0_bm  (1<<0)  /* Prescaler B and C Division factor bit 0 mask. */
+#define CLK_PSBCDIV0_bp  0  /* Prescaler B and C Division factor bit 0 position. */
+#define CLK_PSBCDIV1_bm  (1<<1)  /* Prescaler B and C Division factor bit 1 mask. */
+#define CLK_PSBCDIV1_bp  1  /* Prescaler B and C Division factor bit 1 position. */
+
+/* CLK.LOCK  bit masks and bit positions */
+#define CLK_LOCK_bm  0x01  /* Clock System Lock bit mask. */
+#define CLK_LOCK_bp  0  /* Clock System Lock bit position. */
+
+/* CLK.RTCCTRL  bit masks and bit positions */
+#define CLK_RTCSRC_gm  0x0E  /* Clock Source group mask. */
+#define CLK_RTCSRC_gp  1  /* Clock Source group position. */
+#define CLK_RTCSRC0_bm  (1<<1)  /* Clock Source bit 0 mask. */
+#define CLK_RTCSRC0_bp  1  /* Clock Source bit 0 position. */
+#define CLK_RTCSRC1_bm  (1<<2)  /* Clock Source bit 1 mask. */
+#define CLK_RTCSRC1_bp  2  /* Clock Source bit 1 position. */
+#define CLK_RTCSRC2_bm  (1<<3)  /* Clock Source bit 2 mask. */
+#define CLK_RTCSRC2_bp  3  /* Clock Source bit 2 position. */
+
+#define CLK_RTCEN_bm  0x01  /* Clock Source Enable bit mask. */
+#define CLK_RTCEN_bp  0  /* Clock Source Enable bit position. */
+
+/* CLK.USBCTRL  bit masks and bit positions */
+#define CLK_USBPSDIV_gm  0x38  /* Prescaler Division Factor group mask. */
+#define CLK_USBPSDIV_gp  3  /* Prescaler Division Factor group position. */
+#define CLK_USBPSDIV0_bm  (1<<3)  /* Prescaler Division Factor bit 0 mask. */
+#define CLK_USBPSDIV0_bp  3  /* Prescaler Division Factor bit 0 position. */
+#define CLK_USBPSDIV1_bm  (1<<4)  /* Prescaler Division Factor bit 1 mask. */
+#define CLK_USBPSDIV1_bp  4  /* Prescaler Division Factor bit 1 position. */
+#define CLK_USBPSDIV2_bm  (1<<5)  /* Prescaler Division Factor bit 2 mask. */
+#define CLK_USBPSDIV2_bp  5  /* Prescaler Division Factor bit 2 position. */
+
+#define CLK_USBSRC_gm  0x06  /* Clock Source group mask. */
+#define CLK_USBSRC_gp  1  /* Clock Source group position. */
+#define CLK_USBSRC0_bm  (1<<1)  /* Clock Source bit 0 mask. */
+#define CLK_USBSRC0_bp  1  /* Clock Source bit 0 position. */
+#define CLK_USBSRC1_bm  (1<<2)  /* Clock Source bit 1 mask. */
+#define CLK_USBSRC1_bp  2  /* Clock Source bit 1 position. */
+
+#define CLK_USBSEN_bm  0x01  /* Clock Source Enable bit mask. */
+#define CLK_USBSEN_bp  0  /* Clock Source Enable bit position. */
+
+/* PR.PRGEN  bit masks and bit positions */
+#define PR_USB_bm  0x40  /* USB bit mask. */
+#define PR_USB_bp  6  /* USB bit position. */
+
+#define PR_AES_bm  0x10  /* AES bit mask. */
+#define PR_AES_bp  4  /* AES bit position. */
+
+#define PR_EBI_bm  0x08  /* External Bus Interface bit mask. */
+#define PR_EBI_bp  3  /* External Bus Interface bit position. */
+
+#define PR_RTC_bm  0x04  /* Real-time Counter bit mask. */
+#define PR_RTC_bp  2  /* Real-time Counter bit position. */
+
+#define PR_EVSYS_bm  0x02  /* Event System bit mask. */
+#define PR_EVSYS_bp  1  /* Event System bit position. */
+
+#define PR_DMA_bm  0x01  /* DMA-Controller bit mask. */
+#define PR_DMA_bp  0  /* DMA-Controller bit position. */
+
+/* PR.PRPA  bit masks and bit positions */
+#define PR_DAC_bm  0x04  /* Port A DAC bit mask. */
+#define PR_DAC_bp  2  /* Port A DAC bit position. */
+
+#define PR_ADC_bm  0x02  /* Port A ADC bit mask. */
+#define PR_ADC_bp  1  /* Port A ADC bit position. */
+
+#define PR_AC_bm  0x01  /* Port A Analog Comparator bit mask. */
+#define PR_AC_bp  0  /* Port A Analog Comparator bit position. */
+
+/* PR.PRPB  bit masks and bit positions */
+/* PR_DAC  Predefined. */
+/* PR_DAC  Predefined. */
+
+/* PR_ADC  Predefined. */
+/* PR_ADC  Predefined. */
+
+/* PR_AC  Predefined. */
+/* PR_AC  Predefined. */
+
+/* PR.PRPC  bit masks and bit positions */
+#define PR_TWI_bm  0x40  /* Port C Two-wire Interface bit mask. */
+#define PR_TWI_bp  6  /* Port C Two-wire Interface bit position. */
+
+#define PR_USART1_bm  0x20  /* Port C USART1 bit mask. */
+#define PR_USART1_bp  5  /* Port C USART1 bit position. */
+
+#define PR_USART0_bm  0x10  /* Port C USART0 bit mask. */
+#define PR_USART0_bp  4  /* Port C USART0 bit position. */
+
+#define PR_SPI_bm  0x08  /* Port C SPI bit mask. */
+#define PR_SPI_bp  3  /* Port C SPI bit position. */
+
+#define PR_HIRES_bm  0x04  /* Port C AWEX bit mask. */
+#define PR_HIRES_bp  2  /* Port C AWEX bit position. */
+
+#define PR_TC1_bm  0x02  /* Port C Timer/Counter1 bit mask. */
+#define PR_TC1_bp  1  /* Port C Timer/Counter1 bit position. */
+
+#define PR_TC0_bm  0x01  /* Port C Timer/Counter0 bit mask. */
+#define PR_TC0_bp  0  /* Port C Timer/Counter0 bit position. */
+
+/* PR.PRPD  bit masks and bit positions */
+/* PR_TWI  Predefined. */
+/* PR_TWI  Predefined. */
+
+/* PR_USART1  Predefined. */
+/* PR_USART1  Predefined. */
+
+/* PR_USART0  Predefined. */
+/* PR_USART0  Predefined. */
+
+/* PR_SPI  Predefined. */
+/* PR_SPI  Predefined. */
+
+/* PR_HIRES  Predefined. */
+/* PR_HIRES  Predefined. */
+
+/* PR_TC1  Predefined. */
+/* PR_TC1  Predefined. */
+
+/* PR_TC0  Predefined. */
+/* PR_TC0  Predefined. */
+
+/* PR.PRPE  bit masks and bit positions */
+/* PR_TWI  Predefined. */
+/* PR_TWI  Predefined. */
+
+/* PR_USART1  Predefined. */
+/* PR_USART1  Predefined. */
+
+/* PR_USART0  Predefined. */
+/* PR_USART0  Predefined. */
+
+/* PR_SPI  Predefined. */
+/* PR_SPI  Predefined. */
+
+/* PR_HIRES  Predefined. */
+/* PR_HIRES  Predefined. */
+
+/* PR_TC1  Predefined. */
+/* PR_TC1  Predefined. */
+
+/* PR_TC0  Predefined. */
+/* PR_TC0  Predefined. */
+
+/* PR.PRPF  bit masks and bit positions */
+/* PR_TWI  Predefined. */
+/* PR_TWI  Predefined. */
+
+/* PR_USART1  Predefined. */
+/* PR_USART1  Predefined. */
+
+/* PR_USART0  Predefined. */
+/* PR_USART0  Predefined. */
+
+/* PR_SPI  Predefined. */
+/* PR_SPI  Predefined. */
+
+/* PR_HIRES  Predefined. */
+/* PR_HIRES  Predefined. */
+
+/* PR_TC1  Predefined. */
+/* PR_TC1  Predefined. */
+
+/* PR_TC0  Predefined. */
+/* PR_TC0  Predefined. */
+
+/* SLEEP - Sleep Controller */
+/* SLEEP.CTRL  bit masks and bit positions */
+#define SLEEP_SMODE_gm  0x0E  /* Sleep Mode group mask. */
+#define SLEEP_SMODE_gp  1  /* Sleep Mode group position. */
+#define SLEEP_SMODE0_bm  (1<<1)  /* Sleep Mode bit 0 mask. */
+#define SLEEP_SMODE0_bp  1  /* Sleep Mode bit 0 position. */
+#define SLEEP_SMODE1_bm  (1<<2)  /* Sleep Mode bit 1 mask. */
+#define SLEEP_SMODE1_bp  2  /* Sleep Mode bit 1 position. */
+#define SLEEP_SMODE2_bm  (1<<3)  /* Sleep Mode bit 2 mask. */
+#define SLEEP_SMODE2_bp  3  /* Sleep Mode bit 2 position. */
+
+#define SLEEP_SEN_bm  0x01  /* Sleep Enable bit mask. */
+#define SLEEP_SEN_bp  0  /* Sleep Enable bit position. */
+
+/* OSC - Oscillator */
+/* OSC.CTRL  bit masks and bit positions */
+#define OSC_PLLEN_bm  0x10  /* PLL Enable bit mask. */
+#define OSC_PLLEN_bp  4  /* PLL Enable bit position. */
+
+#define OSC_XOSCEN_bm  0x08  /* External Oscillator Enable bit mask. */
+#define OSC_XOSCEN_bp  3  /* External Oscillator Enable bit position. */
+
+#define OSC_RC32KEN_bm  0x04  /* Internal 32.768 kHz RC Oscillator Enable bit mask. */
+#define OSC_RC32KEN_bp  2  /* Internal 32.768 kHz RC Oscillator Enable bit position. */
+
+#define OSC_RC32MEN_bm  0x02  /* Internal 32 MHz RC Oscillator Enable bit mask. */
+#define OSC_RC32MEN_bp  1  /* Internal 32 MHz RC Oscillator Enable bit position. */
+
+#define OSC_RC2MEN_bm  0x01  /* Internal 2 MHz RC Oscillator Enable bit mask. */
+#define OSC_RC2MEN_bp  0  /* Internal 2 MHz RC Oscillator Enable bit position. */
+
+/* OSC.STATUS  bit masks and bit positions */
+#define OSC_PLLRDY_bm  0x10  /* PLL Ready bit mask. */
+#define OSC_PLLRDY_bp  4  /* PLL Ready bit position. */
+
+#define OSC_XOSCRDY_bm  0x08  /* External Oscillator Ready bit mask. */
+#define OSC_XOSCRDY_bp  3  /* External Oscillator Ready bit position. */
+
+#define OSC_RC32KRDY_bm  0x04  /* Internal 32.768 kHz RC Oscillator Ready bit mask. */
+#define OSC_RC32KRDY_bp  2  /* Internal 32.768 kHz RC Oscillator Ready bit position. */
+
+#define OSC_RC32MRDY_bm  0x02  /* Internal 32 MHz RC Oscillator Ready bit mask. */
+#define OSC_RC32MRDY_bp  1  /* Internal 32 MHz RC Oscillator Ready bit position. */
+
+#define OSC_RC2MRDY_bm  0x01  /* Internal 2 MHz RC Oscillator Ready bit mask. */
+#define OSC_RC2MRDY_bp  0  /* Internal 2 MHz RC Oscillator Ready bit position. */
+
+/* OSC.XOSCCTRL  bit masks and bit positions */
+#define OSC_FRQRANGE_gm  0xC0  /* Frequency Range group mask. */
+#define OSC_FRQRANGE_gp  6  /* Frequency Range group position. */
+#define OSC_FRQRANGE0_bm  (1<<6)  /* Frequency Range bit 0 mask. */
+#define OSC_FRQRANGE0_bp  6  /* Frequency Range bit 0 position. */
+#define OSC_FRQRANGE1_bm  (1<<7)  /* Frequency Range bit 1 mask. */
+#define OSC_FRQRANGE1_bp  7  /* Frequency Range bit 1 position. */
+
+#define OSC_X32KLPM_bm  0x20  /* 32.768 kHz XTAL OSC Low-power Mode bit mask. */
+#define OSC_X32KLPM_bp  5  /* 32.768 kHz XTAL OSC Low-power Mode bit position. */
+
+#define OSC_XOSCPWR_bm  0x10  /* 16 MHz Crystal Oscillator High Power mode bit mask. */
+#define OSC_XOSCPWR_bp  4  /* 16 MHz Crystal Oscillator High Power mode bit position. */
+
+#define OSC_XOSCSEL_gm  0x0F  /* External Oscillator Selection and Startup Time group mask. */
+#define OSC_XOSCSEL_gp  0  /* External Oscillator Selection and Startup Time group position. */
+#define OSC_XOSCSEL0_bm  (1<<0)  /* External Oscillator Selection and Startup Time bit 0 mask. */
+#define OSC_XOSCSEL0_bp  0  /* External Oscillator Selection and Startup Time bit 0 position. */
+#define OSC_XOSCSEL1_bm  (1<<1)  /* External Oscillator Selection and Startup Time bit 1 mask. */
+#define OSC_XOSCSEL1_bp  1  /* External Oscillator Selection and Startup Time bit 1 position. */
+#define OSC_XOSCSEL2_bm  (1<<2)  /* External Oscillator Selection and Startup Time bit 2 mask. */
+#define OSC_XOSCSEL2_bp  2  /* External Oscillator Selection and Startup Time bit 2 position. */
+#define OSC_XOSCSEL3_bm  (1<<3)  /* External Oscillator Selection and Startup Time bit 3 mask. */
+#define OSC_XOSCSEL3_bp  3  /* External Oscillator Selection and Startup Time bit 3 position. */
+
+/* OSC.XOSCFAIL  bit masks and bit positions */
+#define OSC_PLLFDIF_bm  0x08  /* PLL Failure Detection Interrupt Flag bit mask. */
+#define OSC_PLLFDIF_bp  3  /* PLL Failure Detection Interrupt Flag bit position. */
+
+#define OSC_PLLFDEN_bm  0x04  /* PLL Failure Detection Enable bit mask. */
+#define OSC_PLLFDEN_bp  2  /* PLL Failure Detection Enable bit position. */
+
+#define OSC_XOSCFDIF_bm  0x02  /* XOSC Failure Detection Interrupt Flag bit mask. */
+#define OSC_XOSCFDIF_bp  1  /* XOSC Failure Detection Interrupt Flag bit position. */
+
+#define OSC_XOSCFDEN_bm  0x01  /* XOSC Failure Detection Enable bit mask. */
+#define OSC_XOSCFDEN_bp  0  /* XOSC Failure Detection Enable bit position. */
+
+/* OSC.PLLCTRL  bit masks and bit positions */
+#define OSC_PLLSRC_gm  0xC0  /* Clock Source group mask. */
+#define OSC_PLLSRC_gp  6  /* Clock Source group position. */
+#define OSC_PLLSRC0_bm  (1<<6)  /* Clock Source bit 0 mask. */
+#define OSC_PLLSRC0_bp  6  /* Clock Source bit 0 position. */
+#define OSC_PLLSRC1_bm  (1<<7)  /* Clock Source bit 1 mask. */
+#define OSC_PLLSRC1_bp  7  /* Clock Source bit 1 position. */
+
+#define OSC_PLLDIV_bm  0x20  /* Divide by 2 bit mask. */
+#define OSC_PLLDIV_bp  5  /* Divide by 2 bit position. */
+
+#define OSC_PLLFAC_gm  0x1F  /* Multiplication Factor group mask. */
+#define OSC_PLLFAC_gp  0  /* Multiplication Factor group position. */
+#define OSC_PLLFAC0_bm  (1<<0)  /* Multiplication Factor bit 0 mask. */
+#define OSC_PLLFAC0_bp  0  /* Multiplication Factor bit 0 position. */
+#define OSC_PLLFAC1_bm  (1<<1)  /* Multiplication Factor bit 1 mask. */
+#define OSC_PLLFAC1_bp  1  /* Multiplication Factor bit 1 position. */
+#define OSC_PLLFAC2_bm  (1<<2)  /* Multiplication Factor bit 2 mask. */
+#define OSC_PLLFAC2_bp  2  /* Multiplication Factor bit 2 position. */
+#define OSC_PLLFAC3_bm  (1<<3)  /* Multiplication Factor bit 3 mask. */
+#define OSC_PLLFAC3_bp  3  /* Multiplication Factor bit 3 position. */
+#define OSC_PLLFAC4_bm  (1<<4)  /* Multiplication Factor bit 4 mask. */
+#define OSC_PLLFAC4_bp  4  /* Multiplication Factor bit 4 position. */
+
+/* OSC.DFLLCTRL  bit masks and bit positions */
+#define OSC_RC32MCREF_gm  0x06  /* 32 MHz DFLL Calibration Reference group mask. */
+#define OSC_RC32MCREF_gp  1  /* 32 MHz DFLL Calibration Reference group position. */
+#define OSC_RC32MCREF0_bm  (1<<1)  /* 32 MHz DFLL Calibration Reference bit 0 mask. */
+#define OSC_RC32MCREF0_bp  1  /* 32 MHz DFLL Calibration Reference bit 0 position. */
+#define OSC_RC32MCREF1_bm  (1<<2)  /* 32 MHz DFLL Calibration Reference bit 1 mask. */
+#define OSC_RC32MCREF1_bp  2  /* 32 MHz DFLL Calibration Reference bit 1 position. */
+
+#define OSC_RC2MCREF_bm  0x01  /* 2 MHz DFLL Calibration Reference bit mask. */
+#define OSC_RC2MCREF_bp  0  /* 2 MHz DFLL Calibration Reference bit position. */
+
+/* DFLL - DFLL */
+/* DFLL.CTRL  bit masks and bit positions */
+#define DFLL_ENABLE_bm  0x01  /* DFLL Enable bit mask. */
+#define DFLL_ENABLE_bp  0  /* DFLL Enable bit position. */
+
+/* DFLL.CALA  bit masks and bit positions */
+#define DFLL_CALL_gm  0x7F  /* DFLL Calibration Value A group mask. */
+#define DFLL_CALL_gp  0  /* DFLL Calibration Value A group position. */
+#define DFLL_CALL0_bm  (1<<0)  /* DFLL Calibration Value A bit 0 mask. */
+#define DFLL_CALL0_bp  0  /* DFLL Calibration Value A bit 0 position. */
+#define DFLL_CALL1_bm  (1<<1)  /* DFLL Calibration Value A bit 1 mask. */
+#define DFLL_CALL1_bp  1  /* DFLL Calibration Value A bit 1 position. */
+#define DFLL_CALL2_bm  (1<<2)  /* DFLL Calibration Value A bit 2 mask. */
+#define DFLL_CALL2_bp  2  /* DFLL Calibration Value A bit 2 position. */
+#define DFLL_CALL3_bm  (1<<3)  /* DFLL Calibration Value A bit 3 mask. */
+#define DFLL_CALL3_bp  3  /* DFLL Calibration Value A bit 3 position. */
+#define DFLL_CALL4_bm  (1<<4)  /* DFLL Calibration Value A bit 4 mask. */
+#define DFLL_CALL4_bp  4  /* DFLL Calibration Value A bit 4 position. */
+#define DFLL_CALL5_bm  (1<<5)  /* DFLL Calibration Value A bit 5 mask. */
+#define DFLL_CALL5_bp  5  /* DFLL Calibration Value A bit 5 position. */
+#define DFLL_CALL6_bm  (1<<6)  /* DFLL Calibration Value A bit 6 mask. */
+#define DFLL_CALL6_bp  6  /* DFLL Calibration Value A bit 6 position. */
+
+/* DFLL.CALB  bit masks and bit positions */
+#define DFLL_CALH_gm  0x3F  /* DFLL Calibration Value B group mask. */
+#define DFLL_CALH_gp  0  /* DFLL Calibration Value B group position. */
+#define DFLL_CALH0_bm  (1<<0)  /* DFLL Calibration Value B bit 0 mask. */
+#define DFLL_CALH0_bp  0  /* DFLL Calibration Value B bit 0 position. */
+#define DFLL_CALH1_bm  (1<<1)  /* DFLL Calibration Value B bit 1 mask. */
+#define DFLL_CALH1_bp  1  /* DFLL Calibration Value B bit 1 position. */
+#define DFLL_CALH2_bm  (1<<2)  /* DFLL Calibration Value B bit 2 mask. */
+#define DFLL_CALH2_bp  2  /* DFLL Calibration Value B bit 2 position. */
+#define DFLL_CALH3_bm  (1<<3)  /* DFLL Calibration Value B bit 3 mask. */
+#define DFLL_CALH3_bp  3  /* DFLL Calibration Value B bit 3 position. */
+#define DFLL_CALH4_bm  (1<<4)  /* DFLL Calibration Value B bit 4 mask. */
+#define DFLL_CALH4_bp  4  /* DFLL Calibration Value B bit 4 position. */
+#define DFLL_CALH5_bm  (1<<5)  /* DFLL Calibration Value B bit 5 mask. */
+#define DFLL_CALH5_bp  5  /* DFLL Calibration Value B bit 5 position. */
+
+/* RST - Reset */
+/* RST.STATUS  bit masks and bit positions */
+#define RST_SDRF_bm  0x40  /* Spike Detection Reset Flag bit mask. */
+#define RST_SDRF_bp  6  /* Spike Detection Reset Flag bit position. */
+
+#define RST_SRF_bm  0x20  /* Software Reset Flag bit mask. */
+#define RST_SRF_bp  5  /* Software Reset Flag bit position. */
+
+#define RST_PDIRF_bm  0x10  /* Programming and Debug Interface Interface Reset Flag bit mask. */
+#define RST_PDIRF_bp  4  /* Programming and Debug Interface Interface Reset Flag bit position. */
+
+#define RST_WDRF_bm  0x08  /* Watchdog Reset Flag bit mask. */
+#define RST_WDRF_bp  3  /* Watchdog Reset Flag bit position. */
+
+#define RST_BORF_bm  0x04  /* Brown-out Reset Flag bit mask. */
+#define RST_BORF_bp  2  /* Brown-out Reset Flag bit position. */
+
+#define RST_EXTRF_bm  0x02  /* External Reset Flag bit mask. */
+#define RST_EXTRF_bp  1  /* External Reset Flag bit position. */
+
+#define RST_PORF_bm  0x01  /* Power-on Reset Flag bit mask. */
+#define RST_PORF_bp  0  /* Power-on Reset Flag bit position. */
+
+/* RST.CTRL  bit masks and bit positions */
+#define RST_SWRST_bm  0x01  /* Software Reset bit mask. */
+#define RST_SWRST_bp  0  /* Software Reset bit position. */
+
+/* WDT - Watch-Dog Timer */
+/* WDT.CTRL  bit masks and bit positions */
+#define WDT_PER_gm  0x3C  /* Period group mask. */
+#define WDT_PER_gp  2  /* Period group position. */
+#define WDT_PER0_bm  (1<<2)  /* Period bit 0 mask. */
+#define WDT_PER0_bp  2  /* Period bit 0 position. */
+#define WDT_PER1_bm  (1<<3)  /* Period bit 1 mask. */
+#define WDT_PER1_bp  3  /* Period bit 1 position. */
+#define WDT_PER2_bm  (1<<4)  /* Period bit 2 mask. */
+#define WDT_PER2_bp  4  /* Period bit 2 position. */
+#define WDT_PER3_bm  (1<<5)  /* Period bit 3 mask. */
+#define WDT_PER3_bp  5  /* Period bit 3 position. */
+
+#define WDT_ENABLE_bm  0x02  /* Enable bit mask. */
+#define WDT_ENABLE_bp  1  /* Enable bit position. */
+
+#define WDT_CEN_bm  0x01  /* Change Enable bit mask. */
+#define WDT_CEN_bp  0  /* Change Enable bit position. */
+
+/* WDT.WINCTRL  bit masks and bit positions */
+#define WDT_WPER_gm  0x3C  /* Windowed Mode Period group mask. */
+#define WDT_WPER_gp  2  /* Windowed Mode Period group position. */
+#define WDT_WPER0_bm  (1<<2)  /* Windowed Mode Period bit 0 mask. */
+#define WDT_WPER0_bp  2  /* Windowed Mode Period bit 0 position. */
+#define WDT_WPER1_bm  (1<<3)  /* Windowed Mode Period bit 1 mask. */
+#define WDT_WPER1_bp  3  /* Windowed Mode Period bit 1 position. */
+#define WDT_WPER2_bm  (1<<4)  /* Windowed Mode Period bit 2 mask. */
+#define WDT_WPER2_bp  4  /* Windowed Mode Period bit 2 position. */
+#define WDT_WPER3_bm  (1<<5)  /* Windowed Mode Period bit 3 mask. */
+#define WDT_WPER3_bp  5  /* Windowed Mode Period bit 3 position. */
+
+#define WDT_WEN_bm  0x02  /* Windowed Mode Enable bit mask. */
+#define WDT_WEN_bp  1  /* Windowed Mode Enable bit position. */
+
+#define WDT_WCEN_bm  0x01  /* Windowed Mode Change Enable bit mask. */
+#define WDT_WCEN_bp  0  /* Windowed Mode Change Enable bit position. */
+
+/* WDT.STATUS  bit masks and bit positions */
+#define WDT_SYNCBUSY_bm  0x01  /* Syncronization busy bit mask. */
+#define WDT_SYNCBUSY_bp  0  /* Syncronization busy bit position. */
+
+/* MCU - MCU Control */
+/* MCU.MCUCR  bit masks and bit positions */
+#define MCU_JTAGD_bm  0x01  /* JTAG Disable bit mask. */
+#define MCU_JTAGD_bp  0  /* JTAG Disable bit position. */
+
+/* MCU.ANAINIT  bit masks and bit positions */
+#define MCU_STARTUPDLYB_gm  0x0C  /* Analog startup delay Port B group mask. */
+#define MCU_STARTUPDLYB_gp  2  /* Analog startup delay Port B group position. */
+#define MCU_STARTUPDLYB0_bm  (1<<2)  /* Analog startup delay Port B bit 0 mask. */
+#define MCU_STARTUPDLYB0_bp  2  /* Analog startup delay Port B bit 0 position. */
+#define MCU_STARTUPDLYB1_bm  (1<<3)  /* Analog startup delay Port B bit 1 mask. */
+#define MCU_STARTUPDLYB1_bp  3  /* Analog startup delay Port B bit 1 position. */
+
+#define MCU_STARTUPDLYA_gm  0x03  /* Analog startup delay Port A group mask. */
+#define MCU_STARTUPDLYA_gp  0  /* Analog startup delay Port A group position. */
+#define MCU_STARTUPDLYA0_bm  (1<<0)  /* Analog startup delay Port A bit 0 mask. */
+#define MCU_STARTUPDLYA0_bp  0  /* Analog startup delay Port A bit 0 position. */
+#define MCU_STARTUPDLYA1_bm  (1<<1)  /* Analog startup delay Port A bit 1 mask. */
+#define MCU_STARTUPDLYA1_bp  1  /* Analog startup delay Port A bit 1 position. */
+
+/* MCU.EVSYSLOCK  bit masks and bit positions */
+#define MCU_EVSYS1LOCK_bm  0x10  /* Event Channel 4-7 Lock bit mask. */
+#define MCU_EVSYS1LOCK_bp  4  /* Event Channel 4-7 Lock bit position. */
+
+#define MCU_EVSYS0LOCK_bm  0x01  /* Event Channel 0-3 Lock bit mask. */
+#define MCU_EVSYS0LOCK_bp  0  /* Event Channel 0-3 Lock bit position. */
+
+/* MCU.AWEXLOCK  bit masks and bit positions */
+#define MCU_AWEXFLOCK_bm  0x08  /* AWeX on T/C F0 Lock bit mask. */
+#define MCU_AWEXFLOCK_bp  3  /* AWeX on T/C F0 Lock bit position. */
+
+#define MCU_AWEXELOCK_bm  0x04  /* AWeX on T/C E0 Lock bit mask. */
+#define MCU_AWEXELOCK_bp  2  /* AWeX on T/C E0 Lock bit position. */
+
+#define MCU_AWEXDLOCK_bm  0x02  /* AWeX on T/C D0 Lock bit mask. */
+#define MCU_AWEXDLOCK_bp  1  /* AWeX on T/C D0 Lock bit position. */
+
+#define MCU_AWEXCLOCK_bm  0x01  /* AWeX on T/C C0 Lock bit mask. */
+#define MCU_AWEXCLOCK_bp  0  /* AWeX on T/C C0 Lock bit position. */
+
+/* PMIC - Programmable Multi-level Interrupt Controller */
+/* PMIC.STATUS  bit masks and bit positions */
+#define PMIC_NMIEX_bm  0x80  /* Non-maskable Interrupt Executing bit mask. */
+#define PMIC_NMIEX_bp  7  /* Non-maskable Interrupt Executing bit position. */
+
+#define PMIC_HILVLEX_bm  0x04  /* High Level Interrupt Executing bit mask. */
+#define PMIC_HILVLEX_bp  2  /* High Level Interrupt Executing bit position. */
+
+#define PMIC_MEDLVLEX_bm  0x02  /* Medium Level Interrupt Executing bit mask. */
+#define PMIC_MEDLVLEX_bp  1  /* Medium Level Interrupt Executing bit position. */
+
+#define PMIC_LOLVLEX_bm  0x01  /* Low Level Interrupt Executing bit mask. */
+#define PMIC_LOLVLEX_bp  0  /* Low Level Interrupt Executing bit position. */
+
+/* PMIC.INTPRI  bit masks and bit positions */
+#define PMIC_INTPRI_gm  0xFF  /* Interrupt Priority group mask. */
+#define PMIC_INTPRI_gp  0  /* Interrupt Priority group position. */
+#define PMIC_INTPRI0_bm  (1<<0)  /* Interrupt Priority bit 0 mask. */
+#define PMIC_INTPRI0_bp  0  /* Interrupt Priority bit 0 position. */
+#define PMIC_INTPRI1_bm  (1<<1)  /* Interrupt Priority bit 1 mask. */
+#define PMIC_INTPRI1_bp  1  /* Interrupt Priority bit 1 position. */
+#define PMIC_INTPRI2_bm  (1<<2)  /* Interrupt Priority bit 2 mask. */
+#define PMIC_INTPRI2_bp  2  /* Interrupt Priority bit 2 position. */
+#define PMIC_INTPRI3_bm  (1<<3)  /* Interrupt Priority bit 3 mask. */
+#define PMIC_INTPRI3_bp  3  /* Interrupt Priority bit 3 position. */
+#define PMIC_INTPRI4_bm  (1<<4)  /* Interrupt Priority bit 4 mask. */
+#define PMIC_INTPRI4_bp  4  /* Interrupt Priority bit 4 position. */
+#define PMIC_INTPRI5_bm  (1<<5)  /* Interrupt Priority bit 5 mask. */
+#define PMIC_INTPRI5_bp  5  /* Interrupt Priority bit 5 position. */
+#define PMIC_INTPRI6_bm  (1<<6)  /* Interrupt Priority bit 6 mask. */
+#define PMIC_INTPRI6_bp  6  /* Interrupt Priority bit 6 position. */
+#define PMIC_INTPRI7_bm  (1<<7)  /* Interrupt Priority bit 7 mask. */
+#define PMIC_INTPRI7_bp  7  /* Interrupt Priority bit 7 position. */
+
+/* PMIC.CTRL  bit masks and bit positions */
+#define PMIC_RREN_bm  0x80  /* Round-Robin Priority Enable bit mask. */
+#define PMIC_RREN_bp  7  /* Round-Robin Priority Enable bit position. */
+
+#define PMIC_IVSEL_bm  0x40  /* Interrupt Vector Select bit mask. */
+#define PMIC_IVSEL_bp  6  /* Interrupt Vector Select bit position. */
+
+#define PMIC_HILVLEN_bm  0x04  /* High Level Enable bit mask. */
+#define PMIC_HILVLEN_bp  2  /* High Level Enable bit position. */
+
+#define PMIC_MEDLVLEN_bm  0x02  /* Medium Level Enable bit mask. */
+#define PMIC_MEDLVLEN_bp  1  /* Medium Level Enable bit position. */
+
+#define PMIC_LOLVLEN_bm  0x01  /* Low Level Enable bit mask. */
+#define PMIC_LOLVLEN_bp  0  /* Low Level Enable bit position. */
+
+/* PORTCFG - Port Configuration */
+/* PORTCFG.VPCTRLA  bit masks and bit positions */
+#define PORTCFG_VP1MAP_gm  0xF0  /* Virtual Port 1 Mapping group mask. */
+#define PORTCFG_VP1MAP_gp  4  /* Virtual Port 1 Mapping group position. */
+#define PORTCFG_VP1MAP0_bm  (1<<4)  /* Virtual Port 1 Mapping bit 0 mask. */
+#define PORTCFG_VP1MAP0_bp  4  /* Virtual Port 1 Mapping bit 0 position. */
+#define PORTCFG_VP1MAP1_bm  (1<<5)  /* Virtual Port 1 Mapping bit 1 mask. */
+#define PORTCFG_VP1MAP1_bp  5  /* Virtual Port 1 Mapping bit 1 position. */
+#define PORTCFG_VP1MAP2_bm  (1<<6)  /* Virtual Port 1 Mapping bit 2 mask. */
+#define PORTCFG_VP1MAP2_bp  6  /* Virtual Port 1 Mapping bit 2 position. */
+#define PORTCFG_VP1MAP3_bm  (1<<7)  /* Virtual Port 1 Mapping bit 3 mask. */
+#define PORTCFG_VP1MAP3_bp  7  /* Virtual Port 1 Mapping bit 3 position. */
+
+#define PORTCFG_VP0MAP_gm  0x0F  /* Virtual Port 0 Mapping group mask. */
+#define PORTCFG_VP0MAP_gp  0  /* Virtual Port 0 Mapping group position. */
+#define PORTCFG_VP0MAP0_bm  (1<<0)  /* Virtual Port 0 Mapping bit 0 mask. */
+#define PORTCFG_VP0MAP0_bp  0  /* Virtual Port 0 Mapping bit 0 position. */
+#define PORTCFG_VP0MAP1_bm  (1<<1)  /* Virtual Port 0 Mapping bit 1 mask. */
+#define PORTCFG_VP0MAP1_bp  1  /* Virtual Port 0 Mapping bit 1 position. */
+#define PORTCFG_VP0MAP2_bm  (1<<2)  /* Virtual Port 0 Mapping bit 2 mask. */
+#define PORTCFG_VP0MAP2_bp  2  /* Virtual Port 0 Mapping bit 2 position. */
+#define PORTCFG_VP0MAP3_bm  (1<<3)  /* Virtual Port 0 Mapping bit 3 mask. */
+#define PORTCFG_VP0MAP3_bp  3  /* Virtual Port 0 Mapping bit 3 position. */
+
+/* PORTCFG.VPCTRLB  bit masks and bit positions */
+#define PORTCFG_VP3MAP_gm  0xF0  /* Virtual Port 3 Mapping group mask. */
+#define PORTCFG_VP3MAP_gp  4  /* Virtual Port 3 Mapping group position. */
+#define PORTCFG_VP3MAP0_bm  (1<<4)  /* Virtual Port 3 Mapping bit 0 mask. */
+#define PORTCFG_VP3MAP0_bp  4  /* Virtual Port 3 Mapping bit 0 position. */
+#define PORTCFG_VP3MAP1_bm  (1<<5)  /* Virtual Port 3 Mapping bit 1 mask. */
+#define PORTCFG_VP3MAP1_bp  5  /* Virtual Port 3 Mapping bit 1 position. */
+#define PORTCFG_VP3MAP2_bm  (1<<6)  /* Virtual Port 3 Mapping bit 2 mask. */
+#define PORTCFG_VP3MAP2_bp  6  /* Virtual Port 3 Mapping bit 2 position. */
+#define PORTCFG_VP3MAP3_bm  (1<<7)  /* Virtual Port 3 Mapping bit 3 mask. */
+#define PORTCFG_VP3MAP3_bp  7  /* Virtual Port 3 Mapping bit 3 position. */
+
+#define PORTCFG_VP2MAP_gm  0x0F  /* Virtual Port 2 Mapping group mask. */
+#define PORTCFG_VP2MAP_gp  0  /* Virtual Port 2 Mapping group position. */
+#define PORTCFG_VP2MAP0_bm  (1<<0)  /* Virtual Port 2 Mapping bit 0 mask. */
+#define PORTCFG_VP2MAP0_bp  0  /* Virtual Port 2 Mapping bit 0 position. */
+#define PORTCFG_VP2MAP1_bm  (1<<1)  /* Virtual Port 2 Mapping bit 1 mask. */
+#define PORTCFG_VP2MAP1_bp  1  /* Virtual Port 2 Mapping bit 1 position. */
+#define PORTCFG_VP2MAP2_bm  (1<<2)  /* Virtual Port 2 Mapping bit 2 mask. */
+#define PORTCFG_VP2MAP2_bp  2  /* Virtual Port 2 Mapping bit 2 position. */
+#define PORTCFG_VP2MAP3_bm  (1<<3)  /* Virtual Port 2 Mapping bit 3 mask. */
+#define PORTCFG_VP2MAP3_bp  3  /* Virtual Port 2 Mapping bit 3 position. */
+
+/* PORTCFG.CLKEVOUT  bit masks and bit positions */
+#define PORTCFG_CLKOUT_gm  0x03  /* Peripheral Clock Output Port group mask. */
+#define PORTCFG_CLKOUT_gp  0  /* Peripheral Clock Output Port group position. */
+#define PORTCFG_CLKOUT0_bm  (1<<0)  /* Peripheral Clock Output Port bit 0 mask. */
+#define PORTCFG_CLKOUT0_bp  0  /* Peripheral Clock Output Port bit 0 position. */
+#define PORTCFG_CLKOUT1_bm  (1<<1)  /* Peripheral Clock Output Port bit 1 mask. */
+#define PORTCFG_CLKOUT1_bp  1  /* Peripheral Clock Output Port bit 1 position. */
+
+#define PORTCFG_CLKOUTSEL_gm  0x0C  /* Peripheral Clock Output Select group mask. */
+#define PORTCFG_CLKOUTSEL_gp  2  /* Peripheral Clock Output Select group position. */
+#define PORTCFG_CLKOUTSEL0_bm  (1<<2)  /* Peripheral Clock Output Select bit 0 mask. */
+#define PORTCFG_CLKOUTSEL0_bp  2  /* Peripheral Clock Output Select bit 0 position. */
+#define PORTCFG_CLKOUTSEL1_bm  (1<<3)  /* Peripheral Clock Output Select bit 1 mask. */
+#define PORTCFG_CLKOUTSEL1_bp  3  /* Peripheral Clock Output Select bit 1 position. */
+
+#define PORTCFG_EVOUT_gm  0x30  /* Event Output Port group mask. */
+#define PORTCFG_EVOUT_gp  4  /* Event Output Port group position. */
+#define PORTCFG_EVOUT0_bm  (1<<4)  /* Event Output Port bit 0 mask. */
+#define PORTCFG_EVOUT0_bp  4  /* Event Output Port bit 0 position. */
+#define PORTCFG_EVOUT1_bm  (1<<5)  /* Event Output Port bit 1 mask. */
+#define PORTCFG_EVOUT1_bp  5  /* Event Output Port bit 1 position. */
+
+#define PORTCFG_RTCOUT_bm  0x40  /* RTC Clock Output bit mask. */
+#define PORTCFG_RTCOUT_bp  6  /* RTC Clock Output bit position. */
+
+#define PORTCFG_CLKEVPIN_bm  0x80  /* Peripheral Clock and Event Output pin Select bit mask. */
+#define PORTCFG_CLKEVPIN_bp  7  /* Peripheral Clock and Event Output pin Select bit position. */
+
+/* PORTCFG.EBIOUT  bit masks and bit positions */
+#define PORTCFG_EBICSOUT_gm  0x03  /* EBI Chip Select Output group mask. */
+#define PORTCFG_EBICSOUT_gp  0  /* EBI Chip Select Output group position. */
+#define PORTCFG_EBICSOUT0_bm  (1<<0)  /* EBI Chip Select Output bit 0 mask. */
+#define PORTCFG_EBICSOUT0_bp  0  /* EBI Chip Select Output bit 0 position. */
+#define PORTCFG_EBICSOUT1_bm  (1<<1)  /* EBI Chip Select Output bit 1 mask. */
+#define PORTCFG_EBICSOUT1_bp  1  /* EBI Chip Select Output bit 1 position. */
+
+#define PORTCFG_EBIADROUT_gm  0x0C  /* EBI Address Output group mask. */
+#define PORTCFG_EBIADROUT_gp  2  /* EBI Address Output group position. */
+#define PORTCFG_EBIADROUT0_bm  (1<<2)  /* EBI Address Output bit 0 mask. */
+#define PORTCFG_EBIADROUT0_bp  2  /* EBI Address Output bit 0 position. */
+#define PORTCFG_EBIADROUT1_bm  (1<<3)  /* EBI Address Output bit 1 mask. */
+#define PORTCFG_EBIADROUT1_bp  3  /* EBI Address Output bit 1 position. */
+
+/* PORTCFG.EVOUTSEL  bit masks and bit positions */
+#define PORTCFG_EVOUTSEL_gm  0x07  /* Event Output Select group mask. */
+#define PORTCFG_EVOUTSEL_gp  0  /* Event Output Select group position. */
+#define PORTCFG_EVOUTSEL0_bm  (1<<0)  /* Event Output Select bit 0 mask. */
+#define PORTCFG_EVOUTSEL0_bp  0  /* Event Output Select bit 0 position. */
+#define PORTCFG_EVOUTSEL1_bm  (1<<1)  /* Event Output Select bit 1 mask. */
+#define PORTCFG_EVOUTSEL1_bp  1  /* Event Output Select bit 1 position. */
+#define PORTCFG_EVOUTSEL2_bm  (1<<2)  /* Event Output Select bit 2 mask. */
+#define PORTCFG_EVOUTSEL2_bp  2  /* Event Output Select bit 2 position. */
+
+/* AES - AES Module */
+/* AES.CTRL  bit masks and bit positions */
+#define AES_START_bm  0x80  /* Start/Run bit mask. */
+#define AES_START_bp  7  /* Start/Run bit position. */
+
+#define AES_AUTO_bm  0x40  /* Auto Start Trigger bit mask. */
+#define AES_AUTO_bp  6  /* Auto Start Trigger bit position. */
+
+#define AES_RESET_bm  0x20  /* AES Software Reset bit mask. */
+#define AES_RESET_bp  5  /* AES Software Reset bit position. */
+
+#define AES_DECRYPT_bm  0x10  /* Decryption / Direction bit mask. */
+#define AES_DECRYPT_bp  4  /* Decryption / Direction bit position. */
+
+#define AES_XOR_bm  0x04  /* State XOR Load Enable bit mask. */
+#define AES_XOR_bp  2  /* State XOR Load Enable bit position. */
+
+/* AES.STATUS  bit masks and bit positions */
+#define AES_ERROR_bm  0x80  /* AES Error bit mask. */
+#define AES_ERROR_bp  7  /* AES Error bit position. */
+
+#define AES_SRIF_bm  0x01  /* State Ready Interrupt Flag bit mask. */
+#define AES_SRIF_bp  0  /* State Ready Interrupt Flag bit position. */
+
+/* AES.INTCTRL  bit masks and bit positions */
+#define AES_INTLVL_gm  0x03  /* Interrupt level group mask. */
+#define AES_INTLVL_gp  0  /* Interrupt level group position. */
+#define AES_INTLVL0_bm  (1<<0)  /* Interrupt level bit 0 mask. */
+#define AES_INTLVL0_bp  0  /* Interrupt level bit 0 position. */
+#define AES_INTLVL1_bm  (1<<1)  /* Interrupt level bit 1 mask. */
+#define AES_INTLVL1_bp  1  /* Interrupt level bit 1 position. */
+
+/* CRC - Cyclic Redundancy Checker */
+/* CRC.CTRL  bit masks and bit positions */
+#define CRC_RESET_gm  0xC0  /* Reset group mask. */
+#define CRC_RESET_gp  6  /* Reset group position. */
+#define CRC_RESET0_bm  (1<<6)  /* Reset bit 0 mask. */
+#define CRC_RESET0_bp  6  /* Reset bit 0 position. */
+#define CRC_RESET1_bm  (1<<7)  /* Reset bit 1 mask. */
+#define CRC_RESET1_bp  7  /* Reset bit 1 position. */
+
+#define CRC_CRC32_bm  0x20  /* CRC Mode bit mask. */
+#define CRC_CRC32_bp  5  /* CRC Mode bit position. */
+
+#define CRC_SOURCE_gm  0x0F  /* Input Source group mask. */
+#define CRC_SOURCE_gp  0  /* Input Source group position. */
+#define CRC_SOURCE0_bm  (1<<0)  /* Input Source bit 0 mask. */
+#define CRC_SOURCE0_bp  0  /* Input Source bit 0 position. */
+#define CRC_SOURCE1_bm  (1<<1)  /* Input Source bit 1 mask. */
+#define CRC_SOURCE1_bp  1  /* Input Source bit 1 position. */
+#define CRC_SOURCE2_bm  (1<<2)  /* Input Source bit 2 mask. */
+#define CRC_SOURCE2_bp  2  /* Input Source bit 2 position. */
+#define CRC_SOURCE3_bm  (1<<3)  /* Input Source bit 3 mask. */
+#define CRC_SOURCE3_bp  3  /* Input Source bit 3 position. */
+
+/* CRC.STATUS  bit masks and bit positions */
+#define CRC_ZERO_bm  0x02  /* Zero detection bit mask. */
+#define CRC_ZERO_bp  1  /* Zero detection bit position. */
+
+#define CRC_BUSY_bm  0x01  /* Busy bit mask. */
+#define CRC_BUSY_bp  0  /* Busy bit position. */
+
+/* DMA - DMA Controller */
+/* DMA_CH.CTRLA  bit masks and bit positions */
+#define DMA_CH_ENABLE_bm  0x80  /* Channel Enable bit mask. */
+#define DMA_CH_ENABLE_bp  7  /* Channel Enable bit position. */
+
+#define DMA_CH_RESET_bm  0x40  /* Channel Software Reset bit mask. */
+#define DMA_CH_RESET_bp  6  /* Channel Software Reset bit position. */
+
+#define DMA_CH_REPEAT_bm  0x20  /* Channel Repeat Mode bit mask. */
+#define DMA_CH_REPEAT_bp  5  /* Channel Repeat Mode bit position. */
+
+#define DMA_CH_TRFREQ_bm  0x10  /* Channel Transfer Request bit mask. */
+#define DMA_CH_TRFREQ_bp  4  /* Channel Transfer Request bit position. */
+
+#define DMA_CH_SINGLE_bm  0x04  /* Channel Single Shot Data Transfer bit mask. */
+#define DMA_CH_SINGLE_bp  2  /* Channel Single Shot Data Transfer bit position. */
+
+#define DMA_CH_BURSTLEN_gm  0x03  /* Channel Transfer Mode group mask. */
+#define DMA_CH_BURSTLEN_gp  0  /* Channel Transfer Mode group position. */
+#define DMA_CH_BURSTLEN0_bm  (1<<0)  /* Channel Transfer Mode bit 0 mask. */
+#define DMA_CH_BURSTLEN0_bp  0  /* Channel Transfer Mode bit 0 position. */
+#define DMA_CH_BURSTLEN1_bm  (1<<1)  /* Channel Transfer Mode bit 1 mask. */
+#define DMA_CH_BURSTLEN1_bp  1  /* Channel Transfer Mode bit 1 position. */
+
+/* DMA_CH.CTRLB  bit masks and bit positions */
+#define DMA_CH_CHBUSY_bm  0x80  /* Block Transfer Busy bit mask. */
+#define DMA_CH_CHBUSY_bp  7  /* Block Transfer Busy bit position. */
+
+#define DMA_CH_CHPEND_bm  0x40  /* Block Transfer Pending bit mask. */
+#define DMA_CH_CHPEND_bp  6  /* Block Transfer Pending bit position. */
+
+#define DMA_CH_ERRIF_bm  0x20  /* Block Transfer Error Interrupt Flag bit mask. */
+#define DMA_CH_ERRIF_bp  5  /* Block Transfer Error Interrupt Flag bit position. */
+
+#define DMA_CH_TRNIF_bm  0x10  /* Transaction Complete Interrup Flag bit mask. */
+#define DMA_CH_TRNIF_bp  4  /* Transaction Complete Interrup Flag bit position. */
+
+#define DMA_CH_ERRINTLVL_gm  0x0C  /* Transfer Error Interrupt Level group mask. */
+#define DMA_CH_ERRINTLVL_gp  2  /* Transfer Error Interrupt Level group position. */
+#define DMA_CH_ERRINTLVL0_bm  (1<<2)  /* Transfer Error Interrupt Level bit 0 mask. */
+#define DMA_CH_ERRINTLVL0_bp  2  /* Transfer Error Interrupt Level bit 0 position. */
+#define DMA_CH_ERRINTLVL1_bm  (1<<3)  /* Transfer Error Interrupt Level bit 1 mask. */
+#define DMA_CH_ERRINTLVL1_bp  3  /* Transfer Error Interrupt Level bit 1 position. */
+
+#define DMA_CH_TRNINTLVL_gm  0x03  /* Transaction Complete Interrupt Level group mask. */
+#define DMA_CH_TRNINTLVL_gp  0  /* Transaction Complete Interrupt Level group position. */
+#define DMA_CH_TRNINTLVL0_bm  (1<<0)  /* Transaction Complete Interrupt Level bit 0 mask. */
+#define DMA_CH_TRNINTLVL0_bp  0  /* Transaction Complete Interrupt Level bit 0 position. */
+#define DMA_CH_TRNINTLVL1_bm  (1<<1)  /* Transaction Complete Interrupt Level bit 1 mask. */
+#define DMA_CH_TRNINTLVL1_bp  1  /* Transaction Complete Interrupt Level bit 1 position. */
+
+/* DMA_CH.ADDRCTRL  bit masks and bit positions */
+#define DMA_CH_SRCRELOAD_gm  0xC0  /* Channel Source Address Reload group mask. */
+#define DMA_CH_SRCRELOAD_gp  6  /* Channel Source Address Reload group position. */
+#define DMA_CH_SRCRELOAD0_bm  (1<<6)  /* Channel Source Address Reload bit 0 mask. */
+#define DMA_CH_SRCRELOAD0_bp  6  /* Channel Source Address Reload bit 0 position. */
+#define DMA_CH_SRCRELOAD1_bm  (1<<7)  /* Channel Source Address Reload bit 1 mask. */
+#define DMA_CH_SRCRELOAD1_bp  7  /* Channel Source Address Reload bit 1 position. */
+
+#define DMA_CH_SRCDIR_gm  0x30  /* Channel Source Address Mode group mask. */
+#define DMA_CH_SRCDIR_gp  4  /* Channel Source Address Mode group position. */
+#define DMA_CH_SRCDIR0_bm  (1<<4)  /* Channel Source Address Mode bit 0 mask. */
+#define DMA_CH_SRCDIR0_bp  4  /* Channel Source Address Mode bit 0 position. */
+#define DMA_CH_SRCDIR1_bm  (1<<5)  /* Channel Source Address Mode bit 1 mask. */
+#define DMA_CH_SRCDIR1_bp  5  /* Channel Source Address Mode bit 1 position. */
+
+#define DMA_CH_DESTRELOAD_gm  0x0C  /* Channel Destination Address Reload group mask. */
+#define DMA_CH_DESTRELOAD_gp  2  /* Channel Destination Address Reload group position. */
+#define DMA_CH_DESTRELOAD0_bm  (1<<2)  /* Channel Destination Address Reload bit 0 mask. */
+#define DMA_CH_DESTRELOAD0_bp  2  /* Channel Destination Address Reload bit 0 position. */
+#define DMA_CH_DESTRELOAD1_bm  (1<<3)  /* Channel Destination Address Reload bit 1 mask. */
+#define DMA_CH_DESTRELOAD1_bp  3  /* Channel Destination Address Reload bit 1 position. */
+
+#define DMA_CH_DESTDIR_gm  0x03  /* Channel Destination Address Mode group mask. */
+#define DMA_CH_DESTDIR_gp  0  /* Channel Destination Address Mode group position. */
+#define DMA_CH_DESTDIR0_bm  (1<<0)  /* Channel Destination Address Mode bit 0 mask. */
+#define DMA_CH_DESTDIR0_bp  0  /* Channel Destination Address Mode bit 0 position. */
+#define DMA_CH_DESTDIR1_bm  (1<<1)  /* Channel Destination Address Mode bit 1 mask. */
+#define DMA_CH_DESTDIR1_bp  1  /* Channel Destination Address Mode bit 1 position. */
+
+/* DMA_CH.TRIGSRC  bit masks and bit positions */
+#define DMA_CH_TRIGSRC_gm  0xFF  /* Channel Trigger Source group mask. */
+#define DMA_CH_TRIGSRC_gp  0  /* Channel Trigger Source group position. */
+#define DMA_CH_TRIGSRC0_bm  (1<<0)  /* Channel Trigger Source bit 0 mask. */
+#define DMA_CH_TRIGSRC0_bp  0  /* Channel Trigger Source bit 0 position. */
+#define DMA_CH_TRIGSRC1_bm  (1<<1)  /* Channel Trigger Source bit 1 mask. */
+#define DMA_CH_TRIGSRC1_bp  1  /* Channel Trigger Source bit 1 position. */
+#define DMA_CH_TRIGSRC2_bm  (1<<2)  /* Channel Trigger Source bit 2 mask. */
+#define DMA_CH_TRIGSRC2_bp  2  /* Channel Trigger Source bit 2 position. */
+#define DMA_CH_TRIGSRC3_bm  (1<<3)  /* Channel Trigger Source bit 3 mask. */
+#define DMA_CH_TRIGSRC3_bp  3  /* Channel Trigger Source bit 3 position. */
+#define DMA_CH_TRIGSRC4_bm  (1<<4)  /* Channel Trigger Source bit 4 mask. */
+#define DMA_CH_TRIGSRC4_bp  4  /* Channel Trigger Source bit 4 position. */
+#define DMA_CH_TRIGSRC5_bm  (1<<5)  /* Channel Trigger Source bit 5 mask. */
+#define DMA_CH_TRIGSRC5_bp  5  /* Channel Trigger Source bit 5 position. */
+#define DMA_CH_TRIGSRC6_bm  (1<<6)  /* Channel Trigger Source bit 6 mask. */
+#define DMA_CH_TRIGSRC6_bp  6  /* Channel Trigger Source bit 6 position. */
+#define DMA_CH_TRIGSRC7_bm  (1<<7)  /* Channel Trigger Source bit 7 mask. */
+#define DMA_CH_TRIGSRC7_bp  7  /* Channel Trigger Source bit 7 position. */
+
+/* DMA.CTRL  bit masks and bit positions */
+#define DMA_ENABLE_bm  0x80  /* Enable bit mask. */
+#define DMA_ENABLE_bp  7  /* Enable bit position. */
+
+#define DMA_RESET_bm  0x40  /* Software Reset bit mask. */
+#define DMA_RESET_bp  6  /* Software Reset bit position. */
+
+#define DMA_DBUFMODE_gm  0x0C  /* Double Buffering Mode group mask. */
+#define DMA_DBUFMODE_gp  2  /* Double Buffering Mode group position. */
+#define DMA_DBUFMODE0_bm  (1<<2)  /* Double Buffering Mode bit 0 mask. */
+#define DMA_DBUFMODE0_bp  2  /* Double Buffering Mode bit 0 position. */
+#define DMA_DBUFMODE1_bm  (1<<3)  /* Double Buffering Mode bit 1 mask. */
+#define DMA_DBUFMODE1_bp  3  /* Double Buffering Mode bit 1 position. */
+
+#define DMA_PRIMODE_gm  0x03  /* Channel Priority Mode group mask. */
+#define DMA_PRIMODE_gp  0  /* Channel Priority Mode group position. */
+#define DMA_PRIMODE0_bm  (1<<0)  /* Channel Priority Mode bit 0 mask. */
+#define DMA_PRIMODE0_bp  0  /* Channel Priority Mode bit 0 position. */
+#define DMA_PRIMODE1_bm  (1<<1)  /* Channel Priority Mode bit 1 mask. */
+#define DMA_PRIMODE1_bp  1  /* Channel Priority Mode bit 1 position. */
+
+/* DMA.INTFLAGS  bit masks and bit positions */
+#define DMA_CH3ERRIF_bm  0x80  /* Channel 3 Block Transfer Error Interrupt Flag bit mask. */
+#define DMA_CH3ERRIF_bp  7  /* Channel 3 Block Transfer Error Interrupt Flag bit position. */
+
+#define DMA_CH2ERRIF_bm  0x40  /* Channel 2 Block Transfer Error Interrupt Flag bit mask. */
+#define DMA_CH2ERRIF_bp  6  /* Channel 2 Block Transfer Error Interrupt Flag bit position. */
+
+#define DMA_CH1ERRIF_bm  0x20  /* Channel 1 Block Transfer Error Interrupt Flag bit mask. */
+#define DMA_CH1ERRIF_bp  5  /* Channel 1 Block Transfer Error Interrupt Flag bit position. */
+
+#define DMA_CH0ERRIF_bm  0x10  /* Channel 0 Block Transfer Error Interrupt Flag bit mask. */
+#define DMA_CH0ERRIF_bp  4  /* Channel 0 Block Transfer Error Interrupt Flag bit position. */
+
+#define DMA_CH3TRNIF_bm  0x08  /* Channel 3 Transaction Complete Interrupt Flag bit mask. */
+#define DMA_CH3TRNIF_bp  3  /* Channel 3 Transaction Complete Interrupt Flag bit position. */
+
+#define DMA_CH2TRNIF_bm  0x04  /* Channel 2 Transaction Complete Interrupt Flag bit mask. */
+#define DMA_CH2TRNIF_bp  2  /* Channel 2 Transaction Complete Interrupt Flag bit position. */
+
+#define DMA_CH1TRNIF_bm  0x02  /* Channel 1 Transaction Complete Interrupt Flag bit mask. */
+#define DMA_CH1TRNIF_bp  1  /* Channel 1 Transaction Complete Interrupt Flag bit position. */
+
+#define DMA_CH0TRNIF_bm  0x01  /* Channel 0 Transaction Complete Interrupt Flag bit mask. */
+#define DMA_CH0TRNIF_bp  0  /* Channel 0 Transaction Complete Interrupt Flag bit position. */
+
+/* DMA.STATUS  bit masks and bit positions */
+#define DMA_CH3BUSY_bm  0x80  /* Channel 3 Block Transfer Busy bit mask. */
+#define DMA_CH3BUSY_bp  7  /* Channel 3 Block Transfer Busy bit position. */
+
+#define DMA_CH2BUSY_bm  0x40  /* Channel 2 Block Transfer Busy bit mask. */
+#define DMA_CH2BUSY_bp  6  /* Channel 2 Block Transfer Busy bit position. */
+
+#define DMA_CH1BUSY_bm  0x20  /* Channel 1 Block Transfer Busy bit mask. */
+#define DMA_CH1BUSY_bp  5  /* Channel 1 Block Transfer Busy bit position. */
+
+#define DMA_CH0BUSY_bm  0x10  /* Channel 0 Block Transfer Busy bit mask. */
+#define DMA_CH0BUSY_bp  4  /* Channel 0 Block Transfer Busy bit position. */
+
+#define DMA_CH3PEND_bm  0x08  /* Channel 3 Block Transfer Pending bit mask. */
+#define DMA_CH3PEND_bp  3  /* Channel 3 Block Transfer Pending bit position. */
+
+#define DMA_CH2PEND_bm  0x04  /* Channel 2 Block Transfer Pending bit mask. */
+#define DMA_CH2PEND_bp  2  /* Channel 2 Block Transfer Pending bit position. */
+
+#define DMA_CH1PEND_bm  0x02  /* Channel 1 Block Transfer Pending bit mask. */
+#define DMA_CH1PEND_bp  1  /* Channel 1 Block Transfer Pending bit position. */
+
+#define DMA_CH0PEND_bm  0x01  /* Channel 0 Block Transfer Pending bit mask. */
+#define DMA_CH0PEND_bp  0  /* Channel 0 Block Transfer Pending bit position. */
+
+/* EVSYS - Event System */
+/* EVSYS.CH0MUX  bit masks and bit positions */
+#define EVSYS_CHMUX_gm  0xFF  /* Event Channel 0 Multiplexer group mask. */
+#define EVSYS_CHMUX_gp  0  /* Event Channel 0 Multiplexer group position. */
+#define EVSYS_CHMUX0_bm  (1<<0)  /* Event Channel 0 Multiplexer bit 0 mask. */
+#define EVSYS_CHMUX0_bp  0  /* Event Channel 0 Multiplexer bit 0 position. */
+#define EVSYS_CHMUX1_bm  (1<<1)  /* Event Channel 0 Multiplexer bit 1 mask. */
+#define EVSYS_CHMUX1_bp  1  /* Event Channel 0 Multiplexer bit 1 position. */
+#define EVSYS_CHMUX2_bm  (1<<2)  /* Event Channel 0 Multiplexer bit 2 mask. */
+#define EVSYS_CHMUX2_bp  2  /* Event Channel 0 Multiplexer bit 2 position. */
+#define EVSYS_CHMUX3_bm  (1<<3)  /* Event Channel 0 Multiplexer bit 3 mask. */
+#define EVSYS_CHMUX3_bp  3  /* Event Channel 0 Multiplexer bit 3 position. */
+#define EVSYS_CHMUX4_bm  (1<<4)  /* Event Channel 0 Multiplexer bit 4 mask. */
+#define EVSYS_CHMUX4_bp  4  /* Event Channel 0 Multiplexer bit 4 position. */
+#define EVSYS_CHMUX5_bm  (1<<5)  /* Event Channel 0 Multiplexer bit 5 mask. */
+#define EVSYS_CHMUX5_bp  5  /* Event Channel 0 Multiplexer bit 5 position. */
+#define EVSYS_CHMUX6_bm  (1<<6)  /* Event Channel 0 Multiplexer bit 6 mask. */
+#define EVSYS_CHMUX6_bp  6  /* Event Channel 0 Multiplexer bit 6 position. */
+#define EVSYS_CHMUX7_bm  (1<<7)  /* Event Channel 0 Multiplexer bit 7 mask. */
+#define EVSYS_CHMUX7_bp  7  /* Event Channel 0 Multiplexer bit 7 position. */
+
+/* EVSYS.CH1MUX  bit masks and bit positions */
+/* EVSYS_CHMUX  Predefined. */
+/* EVSYS_CHMUX  Predefined. */
+
+/* EVSYS.CH2MUX  bit masks and bit positions */
+/* EVSYS_CHMUX  Predefined. */
+/* EVSYS_CHMUX  Predefined. */
+
+/* EVSYS.CH3MUX  bit masks and bit positions */
+/* EVSYS_CHMUX  Predefined. */
+/* EVSYS_CHMUX  Predefined. */
+
+/* EVSYS.CH4MUX  bit masks and bit positions */
+/* EVSYS_CHMUX  Predefined. */
+/* EVSYS_CHMUX  Predefined. */
+
+/* EVSYS.CH5MUX  bit masks and bit positions */
+/* EVSYS_CHMUX  Predefined. */
+/* EVSYS_CHMUX  Predefined. */
+
+/* EVSYS.CH6MUX  bit masks and bit positions */
+/* EVSYS_CHMUX  Predefined. */
+/* EVSYS_CHMUX  Predefined. */
+
+/* EVSYS.CH7MUX  bit masks and bit positions */
+/* EVSYS_CHMUX  Predefined. */
+/* EVSYS_CHMUX  Predefined. */
+
+/* EVSYS.CH0CTRL  bit masks and bit positions */
+#define EVSYS_QDIRM_gm  0x60  /* Quadrature Decoder Index Recognition Mode group mask. */
+#define EVSYS_QDIRM_gp  5  /* Quadrature Decoder Index Recognition Mode group position. */
+#define EVSYS_QDIRM0_bm  (1<<5)  /* Quadrature Decoder Index Recognition Mode bit 0 mask. */
+#define EVSYS_QDIRM0_bp  5  /* Quadrature Decoder Index Recognition Mode bit 0 position. */
+#define EVSYS_QDIRM1_bm  (1<<6)  /* Quadrature Decoder Index Recognition Mode bit 1 mask. */
+#define EVSYS_QDIRM1_bp  6  /* Quadrature Decoder Index Recognition Mode bit 1 position. */
+
+#define EVSYS_QDIEN_bm  0x10  /* Quadrature Decoder Index Enable bit mask. */
+#define EVSYS_QDIEN_bp  4  /* Quadrature Decoder Index Enable bit position. */
+
+#define EVSYS_QDEN_bm  0x08  /* Quadrature Decoder Enable bit mask. */
+#define EVSYS_QDEN_bp  3  /* Quadrature Decoder Enable bit position. */
+
+#define EVSYS_DIGFILT_gm  0x07  /* Digital Filter group mask. */
+#define EVSYS_DIGFILT_gp  0  /* Digital Filter group position. */
+#define EVSYS_DIGFILT0_bm  (1<<0)  /* Digital Filter bit 0 mask. */
+#define EVSYS_DIGFILT0_bp  0  /* Digital Filter bit 0 position. */
+#define EVSYS_DIGFILT1_bm  (1<<1)  /* Digital Filter bit 1 mask. */
+#define EVSYS_DIGFILT1_bp  1  /* Digital Filter bit 1 position. */
+#define EVSYS_DIGFILT2_bm  (1<<2)  /* Digital Filter bit 2 mask. */
+#define EVSYS_DIGFILT2_bp  2  /* Digital Filter bit 2 position. */
+
+/* EVSYS.CH1CTRL  bit masks and bit positions */
+/* EVSYS_DIGFILT  Predefined. */
+/* EVSYS_DIGFILT  Predefined. */
+
+/* EVSYS.CH2CTRL  bit masks and bit positions */
+/* EVSYS_QDIRM  Predefined. */
+/* EVSYS_QDIRM  Predefined. */
+
+/* EVSYS_QDIEN  Predefined. */
+/* EVSYS_QDIEN  Predefined. */
+
+/* EVSYS_QDEN  Predefined. */
+/* EVSYS_QDEN  Predefined. */
+
+/* EVSYS_DIGFILT  Predefined. */
+/* EVSYS_DIGFILT  Predefined. */
+
+/* EVSYS.CH3CTRL  bit masks and bit positions */
+/* EVSYS_DIGFILT  Predefined. */
+/* EVSYS_DIGFILT  Predefined. */
+
+/* EVSYS.CH4CTRL  bit masks and bit positions */
+/* EVSYS_QDIRM  Predefined. */
+/* EVSYS_QDIRM  Predefined. */
+
+/* EVSYS_QDIEN  Predefined. */
+/* EVSYS_QDIEN  Predefined. */
+
+/* EVSYS_QDEN  Predefined. */
+/* EVSYS_QDEN  Predefined. */
+
+/* EVSYS_DIGFILT  Predefined. */
+/* EVSYS_DIGFILT  Predefined. */
+
+/* EVSYS.CH5CTRL  bit masks and bit positions */
+/* EVSYS_DIGFILT  Predefined. */
+/* EVSYS_DIGFILT  Predefined. */
+
+/* EVSYS.CH6CTRL  bit masks and bit positions */
+/* EVSYS_DIGFILT  Predefined. */
+/* EVSYS_DIGFILT  Predefined. */
+
+/* EVSYS.CH7CTRL  bit masks and bit positions */
+/* EVSYS_DIGFILT  Predefined. */
+/* EVSYS_DIGFILT  Predefined. */
+
+/* NVM - Non Volatile Memory Controller */
+/* NVM.CMD  bit masks and bit positions */
+#define NVM_CMD_gm  0x7F  /* Command group mask. */
+#define NVM_CMD_gp  0  /* Command group position. */
+#define NVM_CMD0_bm  (1<<0)  /* Command bit 0 mask. */
+#define NVM_CMD0_bp  0  /* Command bit 0 position. */
+#define NVM_CMD1_bm  (1<<1)  /* Command bit 1 mask. */
+#define NVM_CMD1_bp  1  /* Command bit 1 position. */
+#define NVM_CMD2_bm  (1<<2)  /* Command bit 2 mask. */
+#define NVM_CMD2_bp  2  /* Command bit 2 position. */
+#define NVM_CMD3_bm  (1<<3)  /* Command bit 3 mask. */
+#define NVM_CMD3_bp  3  /* Command bit 3 position. */
+#define NVM_CMD4_bm  (1<<4)  /* Command bit 4 mask. */
+#define NVM_CMD4_bp  4  /* Command bit 4 position. */
+#define NVM_CMD5_bm  (1<<5)  /* Command bit 5 mask. */
+#define NVM_CMD5_bp  5  /* Command bit 5 position. */
+#define NVM_CMD6_bm  (1<<6)  /* Command bit 6 mask. */
+#define NVM_CMD6_bp  6  /* Command bit 6 position. */
+
+/* NVM.CTRLA  bit masks and bit positions */
+#define NVM_CMDEX_bm  0x01  /* Command Execute bit mask. */
+#define NVM_CMDEX_bp  0  /* Command Execute bit position. */
+
+/* NVM.CTRLB  bit masks and bit positions */
+#define NVM_EEMAPEN_bm  0x08  /* EEPROM Mapping Enable bit mask. */
+#define NVM_EEMAPEN_bp  3  /* EEPROM Mapping Enable bit position. */
+
+#define NVM_FPRM_bm  0x04  /* Flash Power Reduction Enable bit mask. */
+#define NVM_FPRM_bp  2  /* Flash Power Reduction Enable bit position. */
+
+#define NVM_EPRM_bm  0x02  /* EEPROM Power Reduction Enable bit mask. */
+#define NVM_EPRM_bp  1  /* EEPROM Power Reduction Enable bit position. */
+
+#define NVM_SPMLOCK_bm  0x01  /* SPM Lock bit mask. */
+#define NVM_SPMLOCK_bp  0  /* SPM Lock bit position. */
+
+/* NVM.INTCTRL  bit masks and bit positions */
+#define NVM_SPMLVL_gm  0x0C  /* SPM Interrupt Level group mask. */
+#define NVM_SPMLVL_gp  2  /* SPM Interrupt Level group position. */
+#define NVM_SPMLVL0_bm  (1<<2)  /* SPM Interrupt Level bit 0 mask. */
+#define NVM_SPMLVL0_bp  2  /* SPM Interrupt Level bit 0 position. */
+#define NVM_SPMLVL1_bm  (1<<3)  /* SPM Interrupt Level bit 1 mask. */
+#define NVM_SPMLVL1_bp  3  /* SPM Interrupt Level bit 1 position. */
+
+#define NVM_EELVL_gm  0x03  /* EEPROM Interrupt Level group mask. */
+#define NVM_EELVL_gp  0  /* EEPROM Interrupt Level group position. */
+#define NVM_EELVL0_bm  (1<<0)  /* EEPROM Interrupt Level bit 0 mask. */
+#define NVM_EELVL0_bp  0  /* EEPROM Interrupt Level bit 0 position. */
+#define NVM_EELVL1_bm  (1<<1)  /* EEPROM Interrupt Level bit 1 mask. */
+#define NVM_EELVL1_bp  1  /* EEPROM Interrupt Level bit 1 position. */
+
+/* NVM.STATUS  bit masks and bit positions */
+#define NVM_NVMBUSY_bm  0x80  /* Non-volatile Memory Busy bit mask. */
+#define NVM_NVMBUSY_bp  7  /* Non-volatile Memory Busy bit position. */
+
+#define NVM_FBUSY_bm  0x40  /* Flash Memory Busy bit mask. */
+#define NVM_FBUSY_bp  6  /* Flash Memory Busy bit position. */
+
+#define NVM_EELOAD_bm  0x02  /* EEPROM Page Buffer Active Loading bit mask. */
+#define NVM_EELOAD_bp  1  /* EEPROM Page Buffer Active Loading bit position. */
+
+#define NVM_FLOAD_bm  0x01  /* Flash Page Buffer Active Loading bit mask. */
+#define NVM_FLOAD_bp  0  /* Flash Page Buffer Active Loading bit position. */
+
+/* NVM.LOCKBITS  bit masks and bit positions */
+#define NVM_BLBB_gm  0xC0  /* Boot Lock Bits - Boot Section group mask. */
+#define NVM_BLBB_gp  6  /* Boot Lock Bits - Boot Section group position. */
+#define NVM_BLBB0_bm  (1<<6)  /* Boot Lock Bits - Boot Section bit 0 mask. */
+#define NVM_BLBB0_bp  6  /* Boot Lock Bits - Boot Section bit 0 position. */
+#define NVM_BLBB1_bm  (1<<7)  /* Boot Lock Bits - Boot Section bit 1 mask. */
+#define NVM_BLBB1_bp  7  /* Boot Lock Bits - Boot Section bit 1 position. */
+
+#define NVM_BLBA_gm  0x30  /* Boot Lock Bits - Application Section group mask. */
+#define NVM_BLBA_gp  4  /* Boot Lock Bits - Application Section group position. */
+#define NVM_BLBA0_bm  (1<<4)  /* Boot Lock Bits - Application Section bit 0 mask. */
+#define NVM_BLBA0_bp  4  /* Boot Lock Bits - Application Section bit 0 position. */
+#define NVM_BLBA1_bm  (1<<5)  /* Boot Lock Bits - Application Section bit 1 mask. */
+#define NVM_BLBA1_bp  5  /* Boot Lock Bits - Application Section bit 1 position. */
+
+#define NVM_BLBAT_gm  0x0C  /* Boot Lock Bits - Application Table group mask. */
+#define NVM_BLBAT_gp  2  /* Boot Lock Bits - Application Table group position. */
+#define NVM_BLBAT0_bm  (1<<2)  /* Boot Lock Bits - Application Table bit 0 mask. */
+#define NVM_BLBAT0_bp  2  /* Boot Lock Bits - Application Table bit 0 position. */
+#define NVM_BLBAT1_bm  (1<<3)  /* Boot Lock Bits - Application Table bit 1 mask. */
+#define NVM_BLBAT1_bp  3  /* Boot Lock Bits - Application Table bit 1 position. */
+
+#define NVM_LB_gm  0x03  /* Lock Bits group mask. */
+#define NVM_LB_gp  0  /* Lock Bits group position. */
+#define NVM_LB0_bm  (1<<0)  /* Lock Bits bit 0 mask. */
+#define NVM_LB0_bp  0  /* Lock Bits bit 0 position. */
+#define NVM_LB1_bm  (1<<1)  /* Lock Bits bit 1 mask. */
+#define NVM_LB1_bp  1  /* Lock Bits bit 1 position. */
+
+/* AC - Analog Comparator */
+/* AC.AC0CTRL  bit masks and bit positions */
+#define AC_INTMODE_gm  0xC0  /* Interrupt Mode group mask. */
+#define AC_INTMODE_gp  6  /* Interrupt Mode group position. */
+#define AC_INTMODE0_bm  (1<<6)  /* Interrupt Mode bit 0 mask. */
+#define AC_INTMODE0_bp  6  /* Interrupt Mode bit 0 position. */
+#define AC_INTMODE1_bm  (1<<7)  /* Interrupt Mode bit 1 mask. */
+#define AC_INTMODE1_bp  7  /* Interrupt Mode bit 1 position. */
+
+#define AC_INTLVL_gm  0x30  /* Interrupt Level group mask. */
+#define AC_INTLVL_gp  4  /* Interrupt Level group position. */
+#define AC_INTLVL0_bm  (1<<4)  /* Interrupt Level bit 0 mask. */
+#define AC_INTLVL0_bp  4  /* Interrupt Level bit 0 position. */
+#define AC_INTLVL1_bm  (1<<5)  /* Interrupt Level bit 1 mask. */
+#define AC_INTLVL1_bp  5  /* Interrupt Level bit 1 position. */
+
+#define AC_HSMODE_bm  0x08  /* High-speed Mode bit mask. */
+#define AC_HSMODE_bp  3  /* High-speed Mode bit position. */
+
+#define AC_HYSMODE_gm  0x06  /* Hysteresis Mode group mask. */
+#define AC_HYSMODE_gp  1  /* Hysteresis Mode group position. */
+#define AC_HYSMODE0_bm  (1<<1)  /* Hysteresis Mode bit 0 mask. */
+#define AC_HYSMODE0_bp  1  /* Hysteresis Mode bit 0 position. */
+#define AC_HYSMODE1_bm  (1<<2)  /* Hysteresis Mode bit 1 mask. */
+#define AC_HYSMODE1_bp  2  /* Hysteresis Mode bit 1 position. */
+
+#define AC_ENABLE_bm  0x01  /* Enable bit mask. */
+#define AC_ENABLE_bp  0  /* Enable bit position. */
+
+/* AC.AC1CTRL  bit masks and bit positions */
+/* AC_INTMODE  Predefined. */
+/* AC_INTMODE  Predefined. */
+
+/* AC_INTLVL  Predefined. */
+/* AC_INTLVL  Predefined. */
+
+/* AC_HSMODE  Predefined. */
+/* AC_HSMODE  Predefined. */
+
+/* AC_HYSMODE  Predefined. */
+/* AC_HYSMODE  Predefined. */
+
+/* AC_ENABLE  Predefined. */
+/* AC_ENABLE  Predefined. */
+
+/* AC.AC0MUXCTRL  bit masks and bit positions */
+#define AC_MUXPOS_gm  0x38  /* MUX Positive Input group mask. */
+#define AC_MUXPOS_gp  3  /* MUX Positive Input group position. */
+#define AC_MUXPOS0_bm  (1<<3)  /* MUX Positive Input bit 0 mask. */
+#define AC_MUXPOS0_bp  3  /* MUX Positive Input bit 0 position. */
+#define AC_MUXPOS1_bm  (1<<4)  /* MUX Positive Input bit 1 mask. */
+#define AC_MUXPOS1_bp  4  /* MUX Positive Input bit 1 position. */
+#define AC_MUXPOS2_bm  (1<<5)  /* MUX Positive Input bit 2 mask. */
+#define AC_MUXPOS2_bp  5  /* MUX Positive Input bit 2 position. */
+
+#define AC_MUXNEG_gm  0x07  /* MUX Negative Input group mask. */
+#define AC_MUXNEG_gp  0  /* MUX Negative Input group position. */
+#define AC_MUXNEG0_bm  (1<<0)  /* MUX Negative Input bit 0 mask. */
+#define AC_MUXNEG0_bp  0  /* MUX Negative Input bit 0 position. */
+#define AC_MUXNEG1_bm  (1<<1)  /* MUX Negative Input bit 1 mask. */
+#define AC_MUXNEG1_bp  1  /* MUX Negative Input bit 1 position. */
+#define AC_MUXNEG2_bm  (1<<2)  /* MUX Negative Input bit 2 mask. */
+#define AC_MUXNEG2_bp  2  /* MUX Negative Input bit 2 position. */
+
+/* AC.AC1MUXCTRL  bit masks and bit positions */
+/* AC_MUXPOS  Predefined. */
+/* AC_MUXPOS  Predefined. */
+
+/* AC_MUXNEG  Predefined. */
+/* AC_MUXNEG  Predefined. */
+
+/* AC.CTRLA  bit masks and bit positions */
+#define AC_AC1OUT_bm  0x02  /* Analog Comparator 1 Output Enable bit mask. */
+#define AC_AC1OUT_bp  1  /* Analog Comparator 1 Output Enable bit position. */
+
+#define AC_AC0OUT_bm  0x01  /* Analog Comparator 0 Output Enable bit mask. */
+#define AC_AC0OUT_bp  0  /* Analog Comparator 0 Output Enable bit position. */
+
+/* AC.CTRLB  bit masks and bit positions */
+#define AC_SCALEFAC_gm  0x3F  /* VCC Voltage Scaler Factor group mask. */
+#define AC_SCALEFAC_gp  0  /* VCC Voltage Scaler Factor group position. */
+#define AC_SCALEFAC0_bm  (1<<0)  /* VCC Voltage Scaler Factor bit 0 mask. */
+#define AC_SCALEFAC0_bp  0  /* VCC Voltage Scaler Factor bit 0 position. */
+#define AC_SCALEFAC1_bm  (1<<1)  /* VCC Voltage Scaler Factor bit 1 mask. */
+#define AC_SCALEFAC1_bp  1  /* VCC Voltage Scaler Factor bit 1 position. */
+#define AC_SCALEFAC2_bm  (1<<2)  /* VCC Voltage Scaler Factor bit 2 mask. */
+#define AC_SCALEFAC2_bp  2  /* VCC Voltage Scaler Factor bit 2 position. */
+#define AC_SCALEFAC3_bm  (1<<3)  /* VCC Voltage Scaler Factor bit 3 mask. */
+#define AC_SCALEFAC3_bp  3  /* VCC Voltage Scaler Factor bit 3 position. */
+#define AC_SCALEFAC4_bm  (1<<4)  /* VCC Voltage Scaler Factor bit 4 mask. */
+#define AC_SCALEFAC4_bp  4  /* VCC Voltage Scaler Factor bit 4 position. */
+#define AC_SCALEFAC5_bm  (1<<5)  /* VCC Voltage Scaler Factor bit 5 mask. */
+#define AC_SCALEFAC5_bp  5  /* VCC Voltage Scaler Factor bit 5 position. */
+
+/* AC.WINCTRL  bit masks and bit positions */
+#define AC_WEN_bm  0x10  /* Window Mode Enable bit mask. */
+#define AC_WEN_bp  4  /* Window Mode Enable bit position. */
+
+#define AC_WINTMODE_gm  0x0C  /* Window Interrupt Mode group mask. */
+#define AC_WINTMODE_gp  2  /* Window Interrupt Mode group position. */
+#define AC_WINTMODE0_bm  (1<<2)  /* Window Interrupt Mode bit 0 mask. */
+#define AC_WINTMODE0_bp  2  /* Window Interrupt Mode bit 0 position. */
+#define AC_WINTMODE1_bm  (1<<3)  /* Window Interrupt Mode bit 1 mask. */
+#define AC_WINTMODE1_bp  3  /* Window Interrupt Mode bit 1 position. */
+
+#define AC_WINTLVL_gm  0x03  /* Window Interrupt Level group mask. */
+#define AC_WINTLVL_gp  0  /* Window Interrupt Level group position. */
+#define AC_WINTLVL0_bm  (1<<0)  /* Window Interrupt Level bit 0 mask. */
+#define AC_WINTLVL0_bp  0  /* Window Interrupt Level bit 0 position. */
+#define AC_WINTLVL1_bm  (1<<1)  /* Window Interrupt Level bit 1 mask. */
+#define AC_WINTLVL1_bp  1  /* Window Interrupt Level bit 1 position. */
+
+/* AC.STATUS  bit masks and bit positions */
+#define AC_WSTATE_gm  0xC0  /* Window Mode State group mask. */
+#define AC_WSTATE_gp  6  /* Window Mode State group position. */
+#define AC_WSTATE0_bm  (1<<6)  /* Window Mode State bit 0 mask. */
+#define AC_WSTATE0_bp  6  /* Window Mode State bit 0 position. */
+#define AC_WSTATE1_bm  (1<<7)  /* Window Mode State bit 1 mask. */
+#define AC_WSTATE1_bp  7  /* Window Mode State bit 1 position. */
+
+#define AC_AC1STATE_bm  0x20  /* Analog Comparator 1 State bit mask. */
+#define AC_AC1STATE_bp  5  /* Analog Comparator 1 State bit position. */
+
+#define AC_AC0STATE_bm  0x10  /* Analog Comparator 0 State bit mask. */
+#define AC_AC0STATE_bp  4  /* Analog Comparator 0 State bit position. */
+
+#define AC_WIF_bm  0x04  /* Window Mode Interrupt Flag bit mask. */
+#define AC_WIF_bp  2  /* Window Mode Interrupt Flag bit position. */
+
+#define AC_AC1IF_bm  0x02  /* Analog Comparator 1 Interrupt Flag bit mask. */
+#define AC_AC1IF_bp  1  /* Analog Comparator 1 Interrupt Flag bit position. */
+
+#define AC_AC0IF_bm  0x01  /* Analog Comparator 0 Interrupt Flag bit mask. */
+#define AC_AC0IF_bp  0  /* Analog Comparator 0 Interrupt Flag bit position. */
+
+/* ADC - Analog/Digital Converter */
+/* ADC_CH.CTRL  bit masks and bit positions */
+#define ADC_CH_START_bm  0x80  /* Channel Start Conversion bit mask. */
+#define ADC_CH_START_bp  7  /* Channel Start Conversion bit position. */
+
+#define ADC_CH_GAIN_gm  0x1C  /* Gain Factor group mask. */
+#define ADC_CH_GAIN_gp  2  /* Gain Factor group position. */
+#define ADC_CH_GAIN0_bm  (1<<2)  /* Gain Factor bit 0 mask. */
+#define ADC_CH_GAIN0_bp  2  /* Gain Factor bit 0 position. */
+#define ADC_CH_GAIN1_bm  (1<<3)  /* Gain Factor bit 1 mask. */
+#define ADC_CH_GAIN1_bp  3  /* Gain Factor bit 1 position. */
+#define ADC_CH_GAIN2_bm  (1<<4)  /* Gain Factor bit 2 mask. */
+#define ADC_CH_GAIN2_bp  4  /* Gain Factor bit 2 position. */
+
+#define ADC_CH_INPUTMODE_gm  0x03  /* Input Mode Select group mask. */
+#define ADC_CH_INPUTMODE_gp  0  /* Input Mode Select group position. */
+#define ADC_CH_INPUTMODE0_bm  (1<<0)  /* Input Mode Select bit 0 mask. */
+#define ADC_CH_INPUTMODE0_bp  0  /* Input Mode Select bit 0 position. */
+#define ADC_CH_INPUTMODE1_bm  (1<<1)  /* Input Mode Select bit 1 mask. */
+#define ADC_CH_INPUTMODE1_bp  1  /* Input Mode Select bit 1 position. */
+
+/* ADC_CH.MUXCTRL  bit masks and bit positions */
+#define ADC_CH_MUXPOS_gm  0x78  /* MUX selection on Positive ADC input group mask. */
+#define ADC_CH_MUXPOS_gp  3  /* MUX selection on Positive ADC input group position. */
+#define ADC_CH_MUXPOS0_bm  (1<<3)  /* MUX selection on Positive ADC input bit 0 mask. */
+#define ADC_CH_MUXPOS0_bp  3  /* MUX selection on Positive ADC input bit 0 position. */
+#define ADC_CH_MUXPOS1_bm  (1<<4)  /* MUX selection on Positive ADC input bit 1 mask. */
+#define ADC_CH_MUXPOS1_bp  4  /* MUX selection on Positive ADC input bit 1 position. */
+#define ADC_CH_MUXPOS2_bm  (1<<5)  /* MUX selection on Positive ADC input bit 2 mask. */
+#define ADC_CH_MUXPOS2_bp  5  /* MUX selection on Positive ADC input bit 2 position. */
+#define ADC_CH_MUXPOS3_bm  (1<<6)  /* MUX selection on Positive ADC input bit 3 mask. */
+#define ADC_CH_MUXPOS3_bp  6  /* MUX selection on Positive ADC input bit 3 position. */
+
+#define ADC_CH_MUXINT_gm  0x78  /* MUX selection on Internal ADC input group mask. */
+#define ADC_CH_MUXINT_gp  3  /* MUX selection on Internal ADC input group position. */
+#define ADC_CH_MUXINT0_bm  (1<<3)  /* MUX selection on Internal ADC input bit 0 mask. */
+#define ADC_CH_MUXINT0_bp  3  /* MUX selection on Internal ADC input bit 0 position. */
+#define ADC_CH_MUXINT1_bm  (1<<4)  /* MUX selection on Internal ADC input bit 1 mask. */
+#define ADC_CH_MUXINT1_bp  4  /* MUX selection on Internal ADC input bit 1 position. */
+#define ADC_CH_MUXINT2_bm  (1<<5)  /* MUX selection on Internal ADC input bit 2 mask. */
+#define ADC_CH_MUXINT2_bp  5  /* MUX selection on Internal ADC input bit 2 position. */
+#define ADC_CH_MUXINT3_bm  (1<<6)  /* MUX selection on Internal ADC input bit 3 mask. */
+#define ADC_CH_MUXINT3_bp  6  /* MUX selection on Internal ADC input bit 3 position. */
+
+#define ADC_CH_MUXNEG_gm  0x07  /* MUX selection on Negative ADC input group mask. */
+#define ADC_CH_MUXNEG_gp  0  /* MUX selection on Negative ADC input group position. */
+#define ADC_CH_MUXNEG0_bm  (1<<0)  /* MUX selection on Negative ADC input bit 0 mask. */
+#define ADC_CH_MUXNEG0_bp  0  /* MUX selection on Negative ADC input bit 0 position. */
+#define ADC_CH_MUXNEG1_bm  (1<<1)  /* MUX selection on Negative ADC input bit 1 mask. */
+#define ADC_CH_MUXNEG1_bp  1  /* MUX selection on Negative ADC input bit 1 position. */
+#define ADC_CH_MUXNEG2_bm  (1<<2)  /* MUX selection on Negative ADC input bit 2 mask. */
+#define ADC_CH_MUXNEG2_bp  2  /* MUX selection on Negative ADC input bit 2 position. */
+
+/* ADC_CH.INTCTRL  bit masks and bit positions */
+#define ADC_CH_INTMODE_gm  0x0C  /* Interrupt Mode group mask. */
+#define ADC_CH_INTMODE_gp  2  /* Interrupt Mode group position. */
+#define ADC_CH_INTMODE0_bm  (1<<2)  /* Interrupt Mode bit 0 mask. */
+#define ADC_CH_INTMODE0_bp  2  /* Interrupt Mode bit 0 position. */
+#define ADC_CH_INTMODE1_bm  (1<<3)  /* Interrupt Mode bit 1 mask. */
+#define ADC_CH_INTMODE1_bp  3  /* Interrupt Mode bit 1 position. */
+
+#define ADC_CH_INTLVL_gm  0x03  /* Interrupt Level group mask. */
+#define ADC_CH_INTLVL_gp  0  /* Interrupt Level group position. */
+#define ADC_CH_INTLVL0_bm  (1<<0)  /* Interrupt Level bit 0 mask. */
+#define ADC_CH_INTLVL0_bp  0  /* Interrupt Level bit 0 position. */
+#define ADC_CH_INTLVL1_bm  (1<<1)  /* Interrupt Level bit 1 mask. */
+#define ADC_CH_INTLVL1_bp  1  /* Interrupt Level bit 1 position. */
+
+/* ADC_CH.INTFLAGS  bit masks and bit positions */
+#define ADC_CH_CHIF_bm  0x01  /* Channel Interrupt Flag bit mask. */
+#define ADC_CH_CHIF_bp  0  /* Channel Interrupt Flag bit position. */
+
+/* ADC_CH.SCAN  bit masks and bit positions */
+#define ADC_CH_OFFSET_gm  0xF0  /* Positive MUX setting offset group mask. */
+#define ADC_CH_OFFSET_gp  4  /* Positive MUX setting offset group position. */
+#define ADC_CH_OFFSET0_bm  (1<<4)  /* Positive MUX setting offset bit 0 mask. */
+#define ADC_CH_OFFSET0_bp  4  /* Positive MUX setting offset bit 0 position. */
+#define ADC_CH_OFFSET1_bm  (1<<5)  /* Positive MUX setting offset bit 1 mask. */
+#define ADC_CH_OFFSET1_bp  5  /* Positive MUX setting offset bit 1 position. */
+#define ADC_CH_OFFSET2_bm  (1<<6)  /* Positive MUX setting offset bit 2 mask. */
+#define ADC_CH_OFFSET2_bp  6  /* Positive MUX setting offset bit 2 position. */
+#define ADC_CH_OFFSET3_bm  (1<<7)  /* Positive MUX setting offset bit 3 mask. */
+#define ADC_CH_OFFSET3_bp  7  /* Positive MUX setting offset bit 3 position. */
+
+#define ADC_CH_SCANNUM_gm  0x0F  /* Number of Channels included in scan group mask. */
+#define ADC_CH_SCANNUM_gp  0  /* Number of Channels included in scan group position. */
+#define ADC_CH_SCANNUM0_bm  (1<<0)  /* Number of Channels included in scan bit 0 mask. */
+#define ADC_CH_SCANNUM0_bp  0  /* Number of Channels included in scan bit 0 position. */
+#define ADC_CH_SCANNUM1_bm  (1<<1)  /* Number of Channels included in scan bit 1 mask. */
+#define ADC_CH_SCANNUM1_bp  1  /* Number of Channels included in scan bit 1 position. */
+#define ADC_CH_SCANNUM2_bm  (1<<2)  /* Number of Channels included in scan bit 2 mask. */
+#define ADC_CH_SCANNUM2_bp  2  /* Number of Channels included in scan bit 2 position. */
+#define ADC_CH_SCANNUM3_bm  (1<<3)  /* Number of Channels included in scan bit 3 mask. */
+#define ADC_CH_SCANNUM3_bp  3  /* Number of Channels included in scan bit 3 position. */
+
+/* ADC.CTRLA  bit masks and bit positions */
+#define ADC_DMASEL_gm  0xC0  /* DMA Selection group mask. */
+#define ADC_DMASEL_gp  6  /* DMA Selection group position. */
+#define ADC_DMASEL0_bm  (1<<6)  /* DMA Selection bit 0 mask. */
+#define ADC_DMASEL0_bp  6  /* DMA Selection bit 0 position. */
+#define ADC_DMASEL1_bm  (1<<7)  /* DMA Selection bit 1 mask. */
+#define ADC_DMASEL1_bp  7  /* DMA Selection bit 1 position. */
+
+#define ADC_CH3START_bm  0x20  /* Channel 3 Start Conversion bit mask. */
+#define ADC_CH3START_bp  5  /* Channel 3 Start Conversion bit position. */
+
+#define ADC_CH2START_bm  0x10  /* Channel 2 Start Conversion bit mask. */
+#define ADC_CH2START_bp  4  /* Channel 2 Start Conversion bit position. */
+
+#define ADC_CH1START_bm  0x08  /* Channel 1 Start Conversion bit mask. */
+#define ADC_CH1START_bp  3  /* Channel 1 Start Conversion bit position. */
+
+#define ADC_CH0START_bm  0x04  /* Channel 0 Start Conversion bit mask. */
+#define ADC_CH0START_bp  2  /* Channel 0 Start Conversion bit position. */
+
+#define ADC_FLUSH_bm  0x02  /* Flush Pipeline bit mask. */
+#define ADC_FLUSH_bp  1  /* Flush Pipeline bit position. */
+
+#define ADC_ENABLE_bm  0x01  /* Enable ADC bit mask. */
+#define ADC_ENABLE_bp  0  /* Enable ADC bit position. */
+
+/* ADC.CTRLB  bit masks and bit positions */
+#define ADC_IMPMODE_bm  0x80  /* Gain Stage Impedance Mode bit mask. */
+#define ADC_IMPMODE_bp  7  /* Gain Stage Impedance Mode bit position. */
+
+#define ADC_CURRLIMIT_gm  0x60  /* Current Limitation group mask. */
+#define ADC_CURRLIMIT_gp  5  /* Current Limitation group position. */
+#define ADC_CURRLIMIT0_bm  (1<<5)  /* Current Limitation bit 0 mask. */
+#define ADC_CURRLIMIT0_bp  5  /* Current Limitation bit 0 position. */
+#define ADC_CURRLIMIT1_bm  (1<<6)  /* Current Limitation bit 1 mask. */
+#define ADC_CURRLIMIT1_bp  6  /* Current Limitation bit 1 position. */
+
+#define ADC_CONMODE_bm  0x10  /* Conversion Mode bit mask. */
+#define ADC_CONMODE_bp  4  /* Conversion Mode bit position. */
+
+#define ADC_FREERUN_bm  0x08  /* Free Running Mode Enable bit mask. */
+#define ADC_FREERUN_bp  3  /* Free Running Mode Enable bit position. */
+
+#define ADC_RESOLUTION_gm  0x06  /* Result Resolution group mask. */
+#define ADC_RESOLUTION_gp  1  /* Result Resolution group position. */
+#define ADC_RESOLUTION0_bm  (1<<1)  /* Result Resolution bit 0 mask. */
+#define ADC_RESOLUTION0_bp  1  /* Result Resolution bit 0 position. */
+#define ADC_RESOLUTION1_bm  (1<<2)  /* Result Resolution bit 1 mask. */
+#define ADC_RESOLUTION1_bp  2  /* Result Resolution bit 1 position. */
+
+/* ADC.REFCTRL  bit masks and bit positions */
+#define ADC_REFSEL_gm  0x70  /* Reference Selection group mask. */
+#define ADC_REFSEL_gp  4  /* Reference Selection group position. */
+#define ADC_REFSEL0_bm  (1<<4)  /* Reference Selection bit 0 mask. */
+#define ADC_REFSEL0_bp  4  /* Reference Selection bit 0 position. */
+#define ADC_REFSEL1_bm  (1<<5)  /* Reference Selection bit 1 mask. */
+#define ADC_REFSEL1_bp  5  /* Reference Selection bit 1 position. */
+#define ADC_REFSEL2_bm  (1<<6)  /* Reference Selection bit 2 mask. */
+#define ADC_REFSEL2_bp  6  /* Reference Selection bit 2 position. */
+
+#define ADC_BANDGAP_bm  0x02  /* Bandgap enable bit mask. */
+#define ADC_BANDGAP_bp  1  /* Bandgap enable bit position. */
+
+#define ADC_TEMPREF_bm  0x01  /* Temperature Reference Enable bit mask. */
+#define ADC_TEMPREF_bp  0  /* Temperature Reference Enable bit position. */
+
+/* ADC.EVCTRL  bit masks and bit positions */
+#define ADC_SWEEP_gm  0xC0  /* Channel Sweep Selection group mask. */
+#define ADC_SWEEP_gp  6  /* Channel Sweep Selection group position. */
+#define ADC_SWEEP0_bm  (1<<6)  /* Channel Sweep Selection bit 0 mask. */
+#define ADC_SWEEP0_bp  6  /* Channel Sweep Selection bit 0 position. */
+#define ADC_SWEEP1_bm  (1<<7)  /* Channel Sweep Selection bit 1 mask. */
+#define ADC_SWEEP1_bp  7  /* Channel Sweep Selection bit 1 position. */
+
+#define ADC_EVSEL_gm  0x38  /* Event Input Select group mask. */
+#define ADC_EVSEL_gp  3  /* Event Input Select group position. */
+#define ADC_EVSEL0_bm  (1<<3)  /* Event Input Select bit 0 mask. */
+#define ADC_EVSEL0_bp  3  /* Event Input Select bit 0 position. */
+#define ADC_EVSEL1_bm  (1<<4)  /* Event Input Select bit 1 mask. */
+#define ADC_EVSEL1_bp  4  /* Event Input Select bit 1 position. */
+#define ADC_EVSEL2_bm  (1<<5)  /* Event Input Select bit 2 mask. */
+#define ADC_EVSEL2_bp  5  /* Event Input Select bit 2 position. */
+
+#define ADC_EVACT_gm  0x07  /* Event Action Select group mask. */
+#define ADC_EVACT_gp  0  /* Event Action Select group position. */
+#define ADC_EVACT0_bm  (1<<0)  /* Event Action Select bit 0 mask. */
+#define ADC_EVACT0_bp  0  /* Event Action Select bit 0 position. */
+#define ADC_EVACT1_bm  (1<<1)  /* Event Action Select bit 1 mask. */
+#define ADC_EVACT1_bp  1  /* Event Action Select bit 1 position. */
+#define ADC_EVACT2_bm  (1<<2)  /* Event Action Select bit 2 mask. */
+#define ADC_EVACT2_bp  2  /* Event Action Select bit 2 position. */
+
+/* ADC.PRESCALER  bit masks and bit positions */
+#define ADC_PRESCALER_gm  0x07  /* Clock Prescaler Selection group mask. */
+#define ADC_PRESCALER_gp  0  /* Clock Prescaler Selection group position. */
+#define ADC_PRESCALER0_bm  (1<<0)  /* Clock Prescaler Selection bit 0 mask. */
+#define ADC_PRESCALER0_bp  0  /* Clock Prescaler Selection bit 0 position. */
+#define ADC_PRESCALER1_bm  (1<<1)  /* Clock Prescaler Selection bit 1 mask. */
+#define ADC_PRESCALER1_bp  1  /* Clock Prescaler Selection bit 1 position. */
+#define ADC_PRESCALER2_bm  (1<<2)  /* Clock Prescaler Selection bit 2 mask. */
+#define ADC_PRESCALER2_bp  2  /* Clock Prescaler Selection bit 2 position. */
+
+/* ADC.INTFLAGS  bit masks and bit positions */
+#define ADC_CH3IF_bm  0x08  /* Channel 3 Interrupt Flag bit mask. */
+#define ADC_CH3IF_bp  3  /* Channel 3 Interrupt Flag bit position. */
+
+#define ADC_CH2IF_bm  0x04  /* Channel 2 Interrupt Flag bit mask. */
+#define ADC_CH2IF_bp  2  /* Channel 2 Interrupt Flag bit position. */
+
+#define ADC_CH1IF_bm  0x02  /* Channel 1 Interrupt Flag bit mask. */
+#define ADC_CH1IF_bp  1  /* Channel 1 Interrupt Flag bit position. */
+
+#define ADC_CH0IF_bm  0x01  /* Channel 0 Interrupt Flag bit mask. */
+#define ADC_CH0IF_bp  0  /* Channel 0 Interrupt Flag bit position. */
+
+/* DAC - Digital/Analog Converter */
+/* DAC.CTRLA  bit masks and bit positions */
+#define DAC_IDOEN_bm  0x10  /* Internal Output Enable bit mask. */
+#define DAC_IDOEN_bp  4  /* Internal Output Enable bit position. */
+
+#define DAC_CH1EN_bm  0x08  /* Channel 1 Output Enable bit mask. */
+#define DAC_CH1EN_bp  3  /* Channel 1 Output Enable bit position. */
+
+#define DAC_CH0EN_bm  0x04  /* Channel 0 Output Enable bit mask. */
+#define DAC_CH0EN_bp  2  /* Channel 0 Output Enable bit position. */
+
+#define DAC_LPMODE_bm  0x02  /* Low Power Mode bit mask. */
+#define DAC_LPMODE_bp  1  /* Low Power Mode bit position. */
+
+#define DAC_ENABLE_bm  0x01  /* Enable bit mask. */
+#define DAC_ENABLE_bp  0  /* Enable bit position. */
+
+/* DAC.CTRLB  bit masks and bit positions */
+#define DAC_CHSEL_gm  0x60  /* Channel Select group mask. */
+#define DAC_CHSEL_gp  5  /* Channel Select group position. */
+#define DAC_CHSEL0_bm  (1<<5)  /* Channel Select bit 0 mask. */
+#define DAC_CHSEL0_bp  5  /* Channel Select bit 0 position. */
+#define DAC_CHSEL1_bm  (1<<6)  /* Channel Select bit 1 mask. */
+#define DAC_CHSEL1_bp  6  /* Channel Select bit 1 position. */
+
+#define DAC_CH1TRIG_bm  0x02  /* Channel 1 Event Trig Enable bit mask. */
+#define DAC_CH1TRIG_bp  1  /* Channel 1 Event Trig Enable bit position. */
+
+#define DAC_CH0TRIG_bm  0x01  /* Channel 0 Event Trig Enable bit mask. */
+#define DAC_CH0TRIG_bp  0  /* Channel 0 Event Trig Enable bit position. */
+
+/* DAC.CTRLC  bit masks and bit positions */
+#define DAC_REFSEL_gm  0x18  /* Reference Select group mask. */
+#define DAC_REFSEL_gp  3  /* Reference Select group position. */
+#define DAC_REFSEL0_bm  (1<<3)  /* Reference Select bit 0 mask. */
+#define DAC_REFSEL0_bp  3  /* Reference Select bit 0 position. */
+#define DAC_REFSEL1_bm  (1<<4)  /* Reference Select bit 1 mask. */
+#define DAC_REFSEL1_bp  4  /* Reference Select bit 1 position. */
+
+#define DAC_LEFTADJ_bm  0x01  /* Left-adjust Result bit mask. */
+#define DAC_LEFTADJ_bp  0  /* Left-adjust Result bit position. */
+
+/* DAC.EVCTRL  bit masks and bit positions */
+#define DAC_EVSPLIT_bm  0x08  /* Separate Event Channel Input for Channel 1 bit mask. */
+#define DAC_EVSPLIT_bp  3  /* Separate Event Channel Input for Channel 1 bit position. */
+
+#define DAC_EVSEL_gm  0x07  /* Event Input Selection group mask. */
+#define DAC_EVSEL_gp  0  /* Event Input Selection group position. */
+#define DAC_EVSEL0_bm  (1<<0)  /* Event Input Selection bit 0 mask. */
+#define DAC_EVSEL0_bp  0  /* Event Input Selection bit 0 position. */
+#define DAC_EVSEL1_bm  (1<<1)  /* Event Input Selection bit 1 mask. */
+#define DAC_EVSEL1_bp  1  /* Event Input Selection bit 1 position. */
+#define DAC_EVSEL2_bm  (1<<2)  /* Event Input Selection bit 2 mask. */
+#define DAC_EVSEL2_bp  2  /* Event Input Selection bit 2 position. */
+
+/* DAC.STATUS  bit masks and bit positions */
+#define DAC_CH1DRE_bm  0x02  /* Channel 1 Data Register Empty bit mask. */
+#define DAC_CH1DRE_bp  1  /* Channel 1 Data Register Empty bit position. */
+
+#define DAC_CH0DRE_bm  0x01  /* Channel 0 Data Register Empty bit mask. */
+#define DAC_CH0DRE_bp  0  /* Channel 0 Data Register Empty bit position. */
+
+/* DAC.CH0GAINCAL  bit masks and bit positions */
+#define DAC_CH0GAINCAL_gm  0x7F  /* Gain Calibration group mask. */
+#define DAC_CH0GAINCAL_gp  0  /* Gain Calibration group position. */
+#define DAC_CH0GAINCAL0_bm  (1<<0)  /* Gain Calibration bit 0 mask. */
+#define DAC_CH0GAINCAL0_bp  0  /* Gain Calibration bit 0 position. */
+#define DAC_CH0GAINCAL1_bm  (1<<1)  /* Gain Calibration bit 1 mask. */
+#define DAC_CH0GAINCAL1_bp  1  /* Gain Calibration bit 1 position. */
+#define DAC_CH0GAINCAL2_bm  (1<<2)  /* Gain Calibration bit 2 mask. */
+#define DAC_CH0GAINCAL2_bp  2  /* Gain Calibration bit 2 position. */
+#define DAC_CH0GAINCAL3_bm  (1<<3)  /* Gain Calibration bit 3 mask. */
+#define DAC_CH0GAINCAL3_bp  3  /* Gain Calibration bit 3 position. */
+#define DAC_CH0GAINCAL4_bm  (1<<4)  /* Gain Calibration bit 4 mask. */
+#define DAC_CH0GAINCAL4_bp  4  /* Gain Calibration bit 4 position. */
+#define DAC_CH0GAINCAL5_bm  (1<<5)  /* Gain Calibration bit 5 mask. */
+#define DAC_CH0GAINCAL5_bp  5  /* Gain Calibration bit 5 position. */
+#define DAC_CH0GAINCAL6_bm  (1<<6)  /* Gain Calibration bit 6 mask. */
+#define DAC_CH0GAINCAL6_bp  6  /* Gain Calibration bit 6 position. */
+
+/* DAC.CH0OFFSETCAL  bit masks and bit positions */
+#define DAC_CH0OFFSETCAL_gm  0x7F  /* Offset Calibration group mask. */
+#define DAC_CH0OFFSETCAL_gp  0  /* Offset Calibration group position. */
+#define DAC_CH0OFFSETCAL0_bm  (1<<0)  /* Offset Calibration bit 0 mask. */
+#define DAC_CH0OFFSETCAL0_bp  0  /* Offset Calibration bit 0 position. */
+#define DAC_CH0OFFSETCAL1_bm  (1<<1)  /* Offset Calibration bit 1 mask. */
+#define DAC_CH0OFFSETCAL1_bp  1  /* Offset Calibration bit 1 position. */
+#define DAC_CH0OFFSETCAL2_bm  (1<<2)  /* Offset Calibration bit 2 mask. */
+#define DAC_CH0OFFSETCAL2_bp  2  /* Offset Calibration bit 2 position. */
+#define DAC_CH0OFFSETCAL3_bm  (1<<3)  /* Offset Calibration bit 3 mask. */
+#define DAC_CH0OFFSETCAL3_bp  3  /* Offset Calibration bit 3 position. */
+#define DAC_CH0OFFSETCAL4_bm  (1<<4)  /* Offset Calibration bit 4 mask. */
+#define DAC_CH0OFFSETCAL4_bp  4  /* Offset Calibration bit 4 position. */
+#define DAC_CH0OFFSETCAL5_bm  (1<<5)  /* Offset Calibration bit 5 mask. */
+#define DAC_CH0OFFSETCAL5_bp  5  /* Offset Calibration bit 5 position. */
+#define DAC_CH0OFFSETCAL6_bm  (1<<6)  /* Offset Calibration bit 6 mask. */
+#define DAC_CH0OFFSETCAL6_bp  6  /* Offset Calibration bit 6 position. */
+
+/* DAC.CH1GAINCAL  bit masks and bit positions */
+#define DAC_CH1GAINCAL_gm  0x7F  /* Gain Calibration group mask. */
+#define DAC_CH1GAINCAL_gp  0  /* Gain Calibration group position. */
+#define DAC_CH1GAINCAL0_bm  (1<<0)  /* Gain Calibration bit 0 mask. */
+#define DAC_CH1GAINCAL0_bp  0  /* Gain Calibration bit 0 position. */
+#define DAC_CH1GAINCAL1_bm  (1<<1)  /* Gain Calibration bit 1 mask. */
+#define DAC_CH1GAINCAL1_bp  1  /* Gain Calibration bit 1 position. */
+#define DAC_CH1GAINCAL2_bm  (1<<2)  /* Gain Calibration bit 2 mask. */
+#define DAC_CH1GAINCAL2_bp  2  /* Gain Calibration bit 2 position. */
+#define DAC_CH1GAINCAL3_bm  (1<<3)  /* Gain Calibration bit 3 mask. */
+#define DAC_CH1GAINCAL3_bp  3  /* Gain Calibration bit 3 position. */
+#define DAC_CH1GAINCAL4_bm  (1<<4)  /* Gain Calibration bit 4 mask. */
+#define DAC_CH1GAINCAL4_bp  4  /* Gain Calibration bit 4 position. */
+#define DAC_CH1GAINCAL5_bm  (1<<5)  /* Gain Calibration bit 5 mask. */
+#define DAC_CH1GAINCAL5_bp  5  /* Gain Calibration bit 5 position. */
+#define DAC_CH1GAINCAL6_bm  (1<<6)  /* Gain Calibration bit 6 mask. */
+#define DAC_CH1GAINCAL6_bp  6  /* Gain Calibration bit 6 position. */
+
+/* DAC.CH1OFFSETCAL  bit masks and bit positions */
+#define DAC_CH1OFFSETCAL_gm  0x7F  /* Offset Calibration group mask. */
+#define DAC_CH1OFFSETCAL_gp  0  /* Offset Calibration group position. */
+#define DAC_CH1OFFSETCAL0_bm  (1<<0)  /* Offset Calibration bit 0 mask. */
+#define DAC_CH1OFFSETCAL0_bp  0  /* Offset Calibration bit 0 position. */
+#define DAC_CH1OFFSETCAL1_bm  (1<<1)  /* Offset Calibration bit 1 mask. */
+#define DAC_CH1OFFSETCAL1_bp  1  /* Offset Calibration bit 1 position. */
+#define DAC_CH1OFFSETCAL2_bm  (1<<2)  /* Offset Calibration bit 2 mask. */
+#define DAC_CH1OFFSETCAL2_bp  2  /* Offset Calibration bit 2 position. */
+#define DAC_CH1OFFSETCAL3_bm  (1<<3)  /* Offset Calibration bit 3 mask. */
+#define DAC_CH1OFFSETCAL3_bp  3  /* Offset Calibration bit 3 position. */
+#define DAC_CH1OFFSETCAL4_bm  (1<<4)  /* Offset Calibration bit 4 mask. */
+#define DAC_CH1OFFSETCAL4_bp  4  /* Offset Calibration bit 4 position. */
+#define DAC_CH1OFFSETCAL5_bm  (1<<5)  /* Offset Calibration bit 5 mask. */
+#define DAC_CH1OFFSETCAL5_bp  5  /* Offset Calibration bit 5 position. */
+#define DAC_CH1OFFSETCAL6_bm  (1<<6)  /* Offset Calibration bit 6 mask. */
+#define DAC_CH1OFFSETCAL6_bp  6  /* Offset Calibration bit 6 position. */
+
+/* RTC - Real-Time Counter */
+/* RTC.CTRL  bit masks and bit positions */
+#define RTC_PRESCALER_gm  0x07  /* Prescaling Factor group mask. */
+#define RTC_PRESCALER_gp  0  /* Prescaling Factor group position. */
+#define RTC_PRESCALER0_bm  (1<<0)  /* Prescaling Factor bit 0 mask. */
+#define RTC_PRESCALER0_bp  0  /* Prescaling Factor bit 0 position. */
+#define RTC_PRESCALER1_bm  (1<<1)  /* Prescaling Factor bit 1 mask. */
+#define RTC_PRESCALER1_bp  1  /* Prescaling Factor bit 1 position. */
+#define RTC_PRESCALER2_bm  (1<<2)  /* Prescaling Factor bit 2 mask. */
+#define RTC_PRESCALER2_bp  2  /* Prescaling Factor bit 2 position. */
+
+/* RTC.STATUS  bit masks and bit positions */
+#define RTC_SYNCBUSY_bm  0x01  /* Synchronization Busy Flag bit mask. */
+#define RTC_SYNCBUSY_bp  0  /* Synchronization Busy Flag bit position. */
+
+/* RTC.INTCTRL  bit masks and bit positions */
+#define RTC_COMPINTLVL_gm  0x0C  /* Compare Match Interrupt Level group mask. */
+#define RTC_COMPINTLVL_gp  2  /* Compare Match Interrupt Level group position. */
+#define RTC_COMPINTLVL0_bm  (1<<2)  /* Compare Match Interrupt Level bit 0 mask. */
+#define RTC_COMPINTLVL0_bp  2  /* Compare Match Interrupt Level bit 0 position. */
+#define RTC_COMPINTLVL1_bm  (1<<3)  /* Compare Match Interrupt Level bit 1 mask. */
+#define RTC_COMPINTLVL1_bp  3  /* Compare Match Interrupt Level bit 1 position. */
+
+#define RTC_OVFINTLVL_gm  0x03  /* Overflow Interrupt Level group mask. */
+#define RTC_OVFINTLVL_gp  0  /* Overflow Interrupt Level group position. */
+#define RTC_OVFINTLVL0_bm  (1<<0)  /* Overflow Interrupt Level bit 0 mask. */
+#define RTC_OVFINTLVL0_bp  0  /* Overflow Interrupt Level bit 0 position. */
+#define RTC_OVFINTLVL1_bm  (1<<1)  /* Overflow Interrupt Level bit 1 mask. */
+#define RTC_OVFINTLVL1_bp  1  /* Overflow Interrupt Level bit 1 position. */
+
+/* RTC.INTFLAGS  bit masks and bit positions */
+#define RTC_COMPIF_bm  0x02  /* Compare Match Interrupt Flag bit mask. */
+#define RTC_COMPIF_bp  1  /* Compare Match Interrupt Flag bit position. */
+
+#define RTC_OVFIF_bm  0x01  /* Overflow Interrupt Flag bit mask. */
+#define RTC_OVFIF_bp  0  /* Overflow Interrupt Flag bit position. */
+
+/* TWI - Two-Wire Interface */
+/* TWI_MASTER.CTRLA  bit masks and bit positions */
+#define TWI_MASTER_INTLVL_gm  0xC0  /* Interrupt Level group mask. */
+#define TWI_MASTER_INTLVL_gp  6  /* Interrupt Level group position. */
+#define TWI_MASTER_INTLVL0_bm  (1<<6)  /* Interrupt Level bit 0 mask. */
+#define TWI_MASTER_INTLVL0_bp  6  /* Interrupt Level bit 0 position. */
+#define TWI_MASTER_INTLVL1_bm  (1<<7)  /* Interrupt Level bit 1 mask. */
+#define TWI_MASTER_INTLVL1_bp  7  /* Interrupt Level bit 1 position. */
+
+#define TWI_MASTER_RIEN_bm  0x20  /* Read Interrupt Enable bit mask. */
+#define TWI_MASTER_RIEN_bp  5  /* Read Interrupt Enable bit position. */
+
+#define TWI_MASTER_WIEN_bm  0x10  /* Write Interrupt Enable bit mask. */
+#define TWI_MASTER_WIEN_bp  4  /* Write Interrupt Enable bit position. */
+
+#define TWI_MASTER_ENABLE_bm  0x08  /* Enable TWI Master bit mask. */
+#define TWI_MASTER_ENABLE_bp  3  /* Enable TWI Master bit position. */
+
+/* TWI_MASTER.CTRLB  bit masks and bit positions */
+#define TWI_MASTER_TIMEOUT_gm  0x0C  /* Inactive Bus Timeout group mask. */
+#define TWI_MASTER_TIMEOUT_gp  2  /* Inactive Bus Timeout group position. */
+#define TWI_MASTER_TIMEOUT0_bm  (1<<2)  /* Inactive Bus Timeout bit 0 mask. */
+#define TWI_MASTER_TIMEOUT0_bp  2  /* Inactive Bus Timeout bit 0 position. */
+#define TWI_MASTER_TIMEOUT1_bm  (1<<3)  /* Inactive Bus Timeout bit 1 mask. */
+#define TWI_MASTER_TIMEOUT1_bp  3  /* Inactive Bus Timeout bit 1 position. */
+
+#define TWI_MASTER_QCEN_bm  0x02  /* Quick Command Enable bit mask. */
+#define TWI_MASTER_QCEN_bp  1  /* Quick Command Enable bit position. */
+
+#define TWI_MASTER_SMEN_bm  0x01  /* Smart Mode Enable bit mask. */
+#define TWI_MASTER_SMEN_bp  0  /* Smart Mode Enable bit position. */
+
+/* TWI_MASTER.CTRLC  bit masks and bit positions */
+#define TWI_MASTER_ACKACT_bm  0x04  /* Acknowledge Action bit mask. */
+#define TWI_MASTER_ACKACT_bp  2  /* Acknowledge Action bit position. */
+
+#define TWI_MASTER_CMD_gm  0x03  /* Command group mask. */
+#define TWI_MASTER_CMD_gp  0  /* Command group position. */
+#define TWI_MASTER_CMD0_bm  (1<<0)  /* Command bit 0 mask. */
+#define TWI_MASTER_CMD0_bp  0  /* Command bit 0 position. */
+#define TWI_MASTER_CMD1_bm  (1<<1)  /* Command bit 1 mask. */
+#define TWI_MASTER_CMD1_bp  1  /* Command bit 1 position. */
+
+/* TWI_MASTER.STATUS  bit masks and bit positions */
+#define TWI_MASTER_RIF_bm  0x80  /* Read Interrupt Flag bit mask. */
+#define TWI_MASTER_RIF_bp  7  /* Read Interrupt Flag bit position. */
+
+#define TWI_MASTER_WIF_bm  0x40  /* Write Interrupt Flag bit mask. */
+#define TWI_MASTER_WIF_bp  6  /* Write Interrupt Flag bit position. */
+
+#define TWI_MASTER_CLKHOLD_bm  0x20  /* Clock Hold bit mask. */
+#define TWI_MASTER_CLKHOLD_bp  5  /* Clock Hold bit position. */
+
+#define TWI_MASTER_RXACK_bm  0x10  /* Received Acknowledge bit mask. */
+#define TWI_MASTER_RXACK_bp  4  /* Received Acknowledge bit position. */
+
+#define TWI_MASTER_ARBLOST_bm  0x08  /* Arbitration Lost bit mask. */
+#define TWI_MASTER_ARBLOST_bp  3  /* Arbitration Lost bit position. */
+
+#define TWI_MASTER_BUSERR_bm  0x04  /* Bus Error bit mask. */
+#define TWI_MASTER_BUSERR_bp  2  /* Bus Error bit position. */
+
+#define TWI_MASTER_BUSSTATE_gm  0x03  /* Bus State group mask. */
+#define TWI_MASTER_BUSSTATE_gp  0  /* Bus State group position. */
+#define TWI_MASTER_BUSSTATE0_bm  (1<<0)  /* Bus State bit 0 mask. */
+#define TWI_MASTER_BUSSTATE0_bp  0  /* Bus State bit 0 position. */
+#define TWI_MASTER_BUSSTATE1_bm  (1<<1)  /* Bus State bit 1 mask. */
+#define TWI_MASTER_BUSSTATE1_bp  1  /* Bus State bit 1 position. */
+
+/* TWI_SLAVE.CTRLA  bit masks and bit positions */
+#define TWI_SLAVE_INTLVL_gm  0xC0  /* Interrupt Level group mask. */
+#define TWI_SLAVE_INTLVL_gp  6  /* Interrupt Level group position. */
+#define TWI_SLAVE_INTLVL0_bm  (1<<6)  /* Interrupt Level bit 0 mask. */
+#define TWI_SLAVE_INTLVL0_bp  6  /* Interrupt Level bit 0 position. */
+#define TWI_SLAVE_INTLVL1_bm  (1<<7)  /* Interrupt Level bit 1 mask. */
+#define TWI_SLAVE_INTLVL1_bp  7  /* Interrupt Level bit 1 position. */
+
+#define TWI_SLAVE_DIEN_bm  0x20  /* Data Interrupt Enable bit mask. */
+#define TWI_SLAVE_DIEN_bp  5  /* Data Interrupt Enable bit position. */
+
+#define TWI_SLAVE_APIEN_bm  0x10  /* Address/Stop Interrupt Enable bit mask. */
+#define TWI_SLAVE_APIEN_bp  4  /* Address/Stop Interrupt Enable bit position. */
+
+#define TWI_SLAVE_ENABLE_bm  0x08  /* Enable TWI Slave bit mask. */
+#define TWI_SLAVE_ENABLE_bp  3  /* Enable TWI Slave bit position. */
+
+#define TWI_SLAVE_PIEN_bm  0x04  /* Stop Interrupt Enable bit mask. */
+#define TWI_SLAVE_PIEN_bp  2  /* Stop Interrupt Enable bit position. */
+
+#define TWI_SLAVE_PMEN_bm  0x02  /* Promiscuous Mode Enable bit mask. */
+#define TWI_SLAVE_PMEN_bp  1  /* Promiscuous Mode Enable bit position. */
+
+#define TWI_SLAVE_SMEN_bm  0x01  /* Smart Mode Enable bit mask. */
+#define TWI_SLAVE_SMEN_bp  0  /* Smart Mode Enable bit position. */
+
+/* TWI_SLAVE.CTRLB  bit masks and bit positions */
+#define TWI_SLAVE_ACKACT_bm  0x04  /* Acknowledge Action bit mask. */
+#define TWI_SLAVE_ACKACT_bp  2  /* Acknowledge Action bit position. */
+
+#define TWI_SLAVE_CMD_gm  0x03  /* Command group mask. */
+#define TWI_SLAVE_CMD_gp  0  /* Command group position. */
+#define TWI_SLAVE_CMD0_bm  (1<<0)  /* Command bit 0 mask. */
+#define TWI_SLAVE_CMD0_bp  0  /* Command bit 0 position. */
+#define TWI_SLAVE_CMD1_bm  (1<<1)  /* Command bit 1 mask. */
+#define TWI_SLAVE_CMD1_bp  1  /* Command bit 1 position. */
+
+/* TWI_SLAVE.STATUS  bit masks and bit positions */
+#define TWI_SLAVE_DIF_bm  0x80  /* Data Interrupt Flag bit mask. */
+#define TWI_SLAVE_DIF_bp  7  /* Data Interrupt Flag bit position. */
+
+#define TWI_SLAVE_APIF_bm  0x40  /* Address/Stop Interrupt Flag bit mask. */
+#define TWI_SLAVE_APIF_bp  6  /* Address/Stop Interrupt Flag bit position. */
+
+#define TWI_SLAVE_CLKHOLD_bm  0x20  /* Clock Hold bit mask. */
+#define TWI_SLAVE_CLKHOLD_bp  5  /* Clock Hold bit position. */
+
+#define TWI_SLAVE_RXACK_bm  0x10  /* Received Acknowledge bit mask. */
+#define TWI_SLAVE_RXACK_bp  4  /* Received Acknowledge bit position. */
+
+#define TWI_SLAVE_COLL_bm  0x08  /* Collision bit mask. */
+#define TWI_SLAVE_COLL_bp  3  /* Collision bit position. */
+
+#define TWI_SLAVE_BUSERR_bm  0x04  /* Bus Error bit mask. */
+#define TWI_SLAVE_BUSERR_bp  2  /* Bus Error bit position. */
+
+#define TWI_SLAVE_DIR_bm  0x02  /* Read/Write Direction bit mask. */
+#define TWI_SLAVE_DIR_bp  1  /* Read/Write Direction bit position. */
+
+#define TWI_SLAVE_AP_bm  0x01  /* Slave Address or Stop bit mask. */
+#define TWI_SLAVE_AP_bp  0  /* Slave Address or Stop bit position. */
+
+/* TWI_SLAVE.ADDRMASK  bit masks and bit positions */
+#define TWI_SLAVE_ADDRMASK_gm  0xFE  /* Address Mask group mask. */
+#define TWI_SLAVE_ADDRMASK_gp  1  /* Address Mask group position. */
+#define TWI_SLAVE_ADDRMASK0_bm  (1<<1)  /* Address Mask bit 0 mask. */
+#define TWI_SLAVE_ADDRMASK0_bp  1  /* Address Mask bit 0 position. */
+#define TWI_SLAVE_ADDRMASK1_bm  (1<<2)  /* Address Mask bit 1 mask. */
+#define TWI_SLAVE_ADDRMASK1_bp  2  /* Address Mask bit 1 position. */
+#define TWI_SLAVE_ADDRMASK2_bm  (1<<3)  /* Address Mask bit 2 mask. */
+#define TWI_SLAVE_ADDRMASK2_bp  3  /* Address Mask bit 2 position. */
+#define TWI_SLAVE_ADDRMASK3_bm  (1<<4)  /* Address Mask bit 3 mask. */
+#define TWI_SLAVE_ADDRMASK3_bp  4  /* Address Mask bit 3 position. */
+#define TWI_SLAVE_ADDRMASK4_bm  (1<<5)  /* Address Mask bit 4 mask. */
+#define TWI_SLAVE_ADDRMASK4_bp  5  /* Address Mask bit 4 position. */
+#define TWI_SLAVE_ADDRMASK5_bm  (1<<6)  /* Address Mask bit 5 mask. */
+#define TWI_SLAVE_ADDRMASK5_bp  6  /* Address Mask bit 5 position. */
+#define TWI_SLAVE_ADDRMASK6_bm  (1<<7)  /* Address Mask bit 6 mask. */
+#define TWI_SLAVE_ADDRMASK6_bp  7  /* Address Mask bit 6 position. */
+
+#define TWI_SLAVE_ADDREN_bm  0x01  /* Address Enable bit mask. */
+#define TWI_SLAVE_ADDREN_bp  0  /* Address Enable bit position. */
+
+/* TWI.CTRL  bit masks and bit positions */
+#define TWI_SDAHOLD_gm  0x06  /* SDA Hold Time Enable group mask. */
+#define TWI_SDAHOLD_gp  1  /* SDA Hold Time Enable group position. */
+#define TWI_SDAHOLD0_bm  (1<<1)  /* SDA Hold Time Enable bit 0 mask. */
+#define TWI_SDAHOLD0_bp  1  /* SDA Hold Time Enable bit 0 position. */
+#define TWI_SDAHOLD1_bm  (1<<2)  /* SDA Hold Time Enable bit 1 mask. */
+#define TWI_SDAHOLD1_bp  2  /* SDA Hold Time Enable bit 1 position. */
+
+#define TWI_EDIEN_bm  0x01  /* External Driver Interface Enable bit mask. */
+#define TWI_EDIEN_bp  0  /* External Driver Interface Enable bit position. */
+
+/* USB - USB */
+/* USB_EP.STATUS  bit masks and bit positions */
+#define USB_EP_STALLF_bm  0x80  /* Endpoint Stall Flag bit mask. */
+#define USB_EP_STALLF_bp  7  /* Endpoint Stall Flag bit position. */
+
+#define USB_EP_CRC_bm  0x80  /* CRC Error Flag bit mask. */
+#define USB_EP_CRC_bp  7  /* CRC Error Flag bit position. */
+
+#define USB_EP_UNF_bm  0x40  /* Underflow Enpoint FLag bit mask. */
+#define USB_EP_UNF_bp  6  /* Underflow Enpoint FLag bit position. */
+
+#define USB_EP_OVF_bm  0x40  /* Overflow Enpoint Flag for Output Endpoints bit mask. */
+#define USB_EP_OVF_bp  6  /* Overflow Enpoint Flag for Output Endpoints bit position. */
+
+#define USB_EP_TRNCOMPL0_bm  0x20  /* Transaction Complete 0 Flag bit mask. */
+#define USB_EP_TRNCOMPL0_bp  5  /* Transaction Complete 0 Flag bit position. */
+
+#define USB_EP_TRNCOMPL1_bm  0x10  /* Transaction Complete 1 Flag bit mask. */
+#define USB_EP_TRNCOMPL1_bp  4  /* Transaction Complete 1 Flag bit position. */
+
+#define USB_EP_SETUP_bm  0x10  /* SETUP Transaction Complete Flag bit mask. */
+#define USB_EP_SETUP_bp  4  /* SETUP Transaction Complete Flag bit position. */
+
+#define USB_EP_BANK_bm  0x08  /* Bank Select bit mask. */
+#define USB_EP_BANK_bp  3  /* Bank Select bit position. */
+
+#define USB_EP_BUSNACK1_bm  0x04  /* Data Buffer 1 Not Acknowledge bit mask. */
+#define USB_EP_BUSNACK1_bp  2  /* Data Buffer 1 Not Acknowledge bit position. */
+
+#define USB_EP_BUSNACK0_bm  0x02  /* Data Buffer 0 Not Acknowledge bit mask. */
+#define USB_EP_BUSNACK0_bp  1  /* Data Buffer 0 Not Acknowledge bit position. */
+
+#define USB_EP_TOGGLE_bm  0x01  /* Data Toggle bit mask. */
+#define USB_EP_TOGGLE_bp  0  /* Data Toggle bit position. */
+
+/* USB_EP.CTRL  bit masks and bit positions */
+#define USB_EP_TYPE_gm  0xC0  /* Endpoint Type group mask. */
+#define USB_EP_TYPE_gp  6  /* Endpoint Type group position. */
+#define USB_EP_TYPE0_bm  (1<<6)  /* Endpoint Type bit 0 mask. */
+#define USB_EP_TYPE0_bp  6  /* Endpoint Type bit 0 position. */
+#define USB_EP_TYPE1_bm  (1<<7)  /* Endpoint Type bit 1 mask. */
+#define USB_EP_TYPE1_bp  7  /* Endpoint Type bit 1 position. */
+
+#define USB_EP_MULTIPKT_bm  0x20  /* Multi Packet Transfer Enable bit mask. */
+#define USB_EP_MULTIPKT_bp  5  /* Multi Packet Transfer Enable bit position. */
+
+#define USB_EP_PINGPONG_bm  0x10  /* Ping-Pong Enable bit mask. */
+#define USB_EP_PINGPONG_bp  4  /* Ping-Pong Enable bit position. */
+
+#define USB_EP_INTDSBL_bm  0x08  /* Interrupt Disable bit mask. */
+#define USB_EP_INTDSBL_bp  3  /* Interrupt Disable bit position. */
+
+#define USB_EP_STALL_bm  0x04  /* Data Stall bit mask. */
+#define USB_EP_STALL_bp  2  /* Data Stall bit position. */
+
+#define USB_EP_BUFSIZE_gm  0x07  /* Data Buffer Size group mask. */
+#define USB_EP_BUFSIZE_gp  0  /* Data Buffer Size group position. */
+#define USB_EP_BUFSIZE0_bm  (1<<0)  /* Data Buffer Size bit 0 mask. */
+#define USB_EP_BUFSIZE0_bp  0  /* Data Buffer Size bit 0 position. */
+#define USB_EP_BUFSIZE1_bm  (1<<1)  /* Data Buffer Size bit 1 mask. */
+#define USB_EP_BUFSIZE1_bp  1  /* Data Buffer Size bit 1 position. */
+#define USB_EP_BUFSIZE2_bm  (1<<2)  /* Data Buffer Size bit 2 mask. */
+#define USB_EP_BUFSIZE2_bp  2  /* Data Buffer Size bit 2 position. */
+
+/* USB_EP.CNT  bit masks and bit positions */
+#define USB_EP_ZLP_bm  0x8000  /* Zero Length Packet bit mask. */
+#define USB_EP_ZLP_bp  15  /* Zero Length Packet bit position. */
+
+/* USB.CTRLA  bit masks and bit positions */
+#define USB_ENABLE_bm  0x80  /* USB Enable bit mask. */
+#define USB_ENABLE_bp  7  /* USB Enable bit position. */
+
+#define USB_SPEED_bm  0x40  /* Speed Select bit mask. */
+#define USB_SPEED_bp  6  /* Speed Select bit position. */
+
+#define USB_FIFOEN_bm  0x20  /* USB FIFO Enable bit mask. */
+#define USB_FIFOEN_bp  5  /* USB FIFO Enable bit position. */
+
+#define USB_STFRNUM_bm  0x10  /* Store Frame Number Enable bit mask. */
+#define USB_STFRNUM_bp  4  /* Store Frame Number Enable bit position. */
+
+#define USB_MAXEP_gm  0x0F  /* Maximum Endpoint Addresses group mask. */
+#define USB_MAXEP_gp  0  /* Maximum Endpoint Addresses group position. */
+#define USB_MAXEP0_bm  (1<<0)  /* Maximum Endpoint Addresses bit 0 mask. */
+#define USB_MAXEP0_bp  0  /* Maximum Endpoint Addresses bit 0 position. */
+#define USB_MAXEP1_bm  (1<<1)  /* Maximum Endpoint Addresses bit 1 mask. */
+#define USB_MAXEP1_bp  1  /* Maximum Endpoint Addresses bit 1 position. */
+#define USB_MAXEP2_bm  (1<<2)  /* Maximum Endpoint Addresses bit 2 mask. */
+#define USB_MAXEP2_bp  2  /* Maximum Endpoint Addresses bit 2 position. */
+#define USB_MAXEP3_bm  (1<<3)  /* Maximum Endpoint Addresses bit 3 mask. */
+#define USB_MAXEP3_bp  3  /* Maximum Endpoint Addresses bit 3 position. */
+
+/* USB.CTRLB  bit masks and bit positions */
+#define USB_PULLRST_bm  0x10  /* Pull during Reset bit mask. */
+#define USB_PULLRST_bp  4  /* Pull during Reset bit position. */
+
+#define USB_RWAKEUP_bm  0x04  /* Remote Wake-up bit mask. */
+#define USB_RWAKEUP_bp  2  /* Remote Wake-up bit position. */
+
+#define USB_GNACK_bm  0x02  /* Global NACK bit mask. */
+#define USB_GNACK_bp  1  /* Global NACK bit position. */
+
+#define USB_ATTACH_bm  0x01  /* Attach bit mask. */
+#define USB_ATTACH_bp  0  /* Attach bit position. */
+
+/* USB.STATUS  bit masks and bit positions */
+#define USB_URESUME_bm  0x08  /* Upstream Resume bit mask. */
+#define USB_URESUME_bp  3  /* Upstream Resume bit position. */
+
+#define USB_RESUME_bm  0x04  /* Resume bit mask. */
+#define USB_RESUME_bp  2  /* Resume bit position. */
+
+#define USB_SUSPEND_bm  0x02  /* Bus Suspended bit mask. */
+#define USB_SUSPEND_bp  1  /* Bus Suspended bit position. */
+
+#define USB_BUSRST_bm  0x01  /* Bus Reset bit mask. */
+#define USB_BUSRST_bp  0  /* Bus Reset bit position. */
+
+/* USB.ADDR  bit masks and bit positions */
+#define USB_ADDR_gm  0x7F  /* Device Address group mask. */
+#define USB_ADDR_gp  0  /* Device Address group position. */
+#define USB_ADDR0_bm  (1<<0)  /* Device Address bit 0 mask. */
+#define USB_ADDR0_bp  0  /* Device Address bit 0 position. */
+#define USB_ADDR1_bm  (1<<1)  /* Device Address bit 1 mask. */
+#define USB_ADDR1_bp  1  /* Device Address bit 1 position. */
+#define USB_ADDR2_bm  (1<<2)  /* Device Address bit 2 mask. */
+#define USB_ADDR2_bp  2  /* Device Address bit 2 position. */
+#define USB_ADDR3_bm  (1<<3)  /* Device Address bit 3 mask. */
+#define USB_ADDR3_bp  3  /* Device Address bit 3 position. */
+#define USB_ADDR4_bm  (1<<4)  /* Device Address bit 4 mask. */
+#define USB_ADDR4_bp  4  /* Device Address bit 4 position. */
+#define USB_ADDR5_bm  (1<<5)  /* Device Address bit 5 mask. */
+#define USB_ADDR5_bp  5  /* Device Address bit 5 position. */
+#define USB_ADDR6_bm  (1<<6)  /* Device Address bit 6 mask. */
+#define USB_ADDR6_bp  6  /* Device Address bit 6 position. */
+
+/* USB.FIFOWP  bit masks and bit positions */
+#define USB_FIFOWP_gm  0x1F  /* FIFO Write Pointer group mask. */
+#define USB_FIFOWP_gp  0  /* FIFO Write Pointer group position. */
+#define USB_FIFOWP0_bm  (1<<0)  /* FIFO Write Pointer bit 0 mask. */
+#define USB_FIFOWP0_bp  0  /* FIFO Write Pointer bit 0 position. */
+#define USB_FIFOWP1_bm  (1<<1)  /* FIFO Write Pointer bit 1 mask. */
+#define USB_FIFOWP1_bp  1  /* FIFO Write Pointer bit 1 position. */
+#define USB_FIFOWP2_bm  (1<<2)  /* FIFO Write Pointer bit 2 mask. */
+#define USB_FIFOWP2_bp  2  /* FIFO Write Pointer bit 2 position. */
+#define USB_FIFOWP3_bm  (1<<3)  /* FIFO Write Pointer bit 3 mask. */
+#define USB_FIFOWP3_bp  3  /* FIFO Write Pointer bit 3 position. */
+#define USB_FIFOWP4_bm  (1<<4)  /* FIFO Write Pointer bit 4 mask. */
+#define USB_FIFOWP4_bp  4  /* FIFO Write Pointer bit 4 position. */
+
+/* USB.FIFORP  bit masks and bit positions */
+#define USB_FIFORP_gm  0x1F  /* FIFO Read Pointer group mask. */
+#define USB_FIFORP_gp  0  /* FIFO Read Pointer group position. */
+#define USB_FIFORP0_bm  (1<<0)  /* FIFO Read Pointer bit 0 mask. */
+#define USB_FIFORP0_bp  0  /* FIFO Read Pointer bit 0 position. */
+#define USB_FIFORP1_bm  (1<<1)  /* FIFO Read Pointer bit 1 mask. */
+#define USB_FIFORP1_bp  1  /* FIFO Read Pointer bit 1 position. */
+#define USB_FIFORP2_bm  (1<<2)  /* FIFO Read Pointer bit 2 mask. */
+#define USB_FIFORP2_bp  2  /* FIFO Read Pointer bit 2 position. */
+#define USB_FIFORP3_bm  (1<<3)  /* FIFO Read Pointer bit 3 mask. */
+#define USB_FIFORP3_bp  3  /* FIFO Read Pointer bit 3 position. */
+#define USB_FIFORP4_bm  (1<<4)  /* FIFO Read Pointer bit 4 mask. */
+#define USB_FIFORP4_bp  4  /* FIFO Read Pointer bit 4 position. */
+
+/* USB.INTCTRLA  bit masks and bit positions */
+#define USB_SOFIE_bm  0x80  /* Start Of Frame Interrupt Enable bit mask. */
+#define USB_SOFIE_bp  7  /* Start Of Frame Interrupt Enable bit position. */
+
+#define USB_BUSEVIE_bm  0x40  /* Bus Event Interrupt Enable bit mask. */
+#define USB_BUSEVIE_bp  6  /* Bus Event Interrupt Enable bit position. */
+
+#define USB_BUSERRIE_bm  0x20  /* Bus Error Interrupt Enable bit mask. */
+#define USB_BUSERRIE_bp  5  /* Bus Error Interrupt Enable bit position. */
+
+#define USB_STALLIE_bm  0x10  /* STALL Interrupt Enable bit mask. */
+#define USB_STALLIE_bp  4  /* STALL Interrupt Enable bit position. */
+
+#define USB_INTLVL_gm  0x03  /* Interrupt Level group mask. */
+#define USB_INTLVL_gp  0  /* Interrupt Level group position. */
+#define USB_INTLVL0_bm  (1<<0)  /* Interrupt Level bit 0 mask. */
+#define USB_INTLVL0_bp  0  /* Interrupt Level bit 0 position. */
+#define USB_INTLVL1_bm  (1<<1)  /* Interrupt Level bit 1 mask. */
+#define USB_INTLVL1_bp  1  /* Interrupt Level bit 1 position. */
+
+/* USB.INTCTRLB  bit masks and bit positions */
+#define USB_TRNIE_bm  0x02  /* Transaction Complete Interrupt Enable bit mask. */
+#define USB_TRNIE_bp  1  /* Transaction Complete Interrupt Enable bit position. */
+
+#define USB_SETUPIE_bm  0x01  /* SETUP Transaction Complete Interrupt Enable bit mask. */
+#define USB_SETUPIE_bp  0  /* SETUP Transaction Complete Interrupt Enable bit position. */
+
+/* USB.INTFLAGSACLR  bit masks and bit positions */
+#define USB_SOFIF_bm  0x80  /* Start Of Frame Interrupt Flag bit mask. */
+#define USB_SOFIF_bp  7  /* Start Of Frame Interrupt Flag bit position. */
+
+#define USB_SUSPENDIF_bm  0x40  /* Suspend Interrupt Flag bit mask. */
+#define USB_SUSPENDIF_bp  6  /* Suspend Interrupt Flag bit position. */
+
+#define USB_RESUMEIF_bm  0x20  /* Resume Interrupt Flag bit mask. */
+#define USB_RESUMEIF_bp  5  /* Resume Interrupt Flag bit position. */
+
+#define USB_RSTIF_bm  0x10  /* Reset Interrupt Flag bit mask. */
+#define USB_RSTIF_bp  4  /* Reset Interrupt Flag bit position. */
+
+#define USB_CRCIF_bm  0x08  /* Isochronous CRC Error Interrupt Flag bit mask. */
+#define USB_CRCIF_bp  3  /* Isochronous CRC Error Interrupt Flag bit position. */
+
+#define USB_UNFIF_bm  0x04  /* Underflow Interrupt Flag bit mask. */
+#define USB_UNFIF_bp  2  /* Underflow Interrupt Flag bit position. */
+
+#define USB_OVFIF_bm  0x02  /* Overflow Interrupt Flag bit mask. */
+#define USB_OVFIF_bp  1  /* Overflow Interrupt Flag bit position. */
+
+#define USB_STALLIF_bm  0x01  /* STALL Interrupt Flag bit mask. */
+#define USB_STALLIF_bp  0  /* STALL Interrupt Flag bit position. */
+
+/* USB.INTFLAGSASET  bit masks and bit positions */
+/* USB_SOFIF  Predefined. */
+/* USB_SOFIF  Predefined. */
+
+/* USB_SUSPENDIF  Predefined. */
+/* USB_SUSPENDIF  Predefined. */
+
+/* USB_RESUMEIF  Predefined. */
+/* USB_RESUMEIF  Predefined. */
+
+/* USB_RSTIF  Predefined. */
+/* USB_RSTIF  Predefined. */
+
+/* USB_CRCIF  Predefined. */
+/* USB_CRCIF  Predefined. */
+
+/* USB_UNFIF  Predefined. */
+/* USB_UNFIF  Predefined. */
+
+/* USB_OVFIF  Predefined. */
+/* USB_OVFIF  Predefined. */
+
+/* USB_STALLIF  Predefined. */
+/* USB_STALLIF  Predefined. */
+
+/* USB.INTFLAGSBCLR  bit masks and bit positions */
+#define USB_TRNIF_bm  0x02  /* Transaction Complete Interrupt Flag bit mask. */
+#define USB_TRNIF_bp  1  /* Transaction Complete Interrupt Flag bit position. */
+
+#define USB_SETUPIF_bm  0x01  /* SETUP Transaction Complete Interrupt Flag bit mask. */
+#define USB_SETUPIF_bp  0  /* SETUP Transaction Complete Interrupt Flag bit position. */
+
+/* USB.INTFLAGSBSET  bit masks and bit positions */
+/* USB_TRNIF  Predefined. */
+/* USB_TRNIF  Predefined. */
+
+/* USB_SETUPIF  Predefined. */
+/* USB_SETUPIF  Predefined. */
+
+/* PORT - I/O Port Configuration */
+/* PORT.INTCTRL  bit masks and bit positions */
+#define PORT_INT1LVL_gm  0x0C  /* Port Interrupt 1 Level group mask. */
+#define PORT_INT1LVL_gp  2  /* Port Interrupt 1 Level group position. */
+#define PORT_INT1LVL0_bm  (1<<2)  /* Port Interrupt 1 Level bit 0 mask. */
+#define PORT_INT1LVL0_bp  2  /* Port Interrupt 1 Level bit 0 position. */
+#define PORT_INT1LVL1_bm  (1<<3)  /* Port Interrupt 1 Level bit 1 mask. */
+#define PORT_INT1LVL1_bp  3  /* Port Interrupt 1 Level bit 1 position. */
+
+#define PORT_INT0LVL_gm  0x03  /* Port Interrupt 0 Level group mask. */
+#define PORT_INT0LVL_gp  0  /* Port Interrupt 0 Level group position. */
+#define PORT_INT0LVL0_bm  (1<<0)  /* Port Interrupt 0 Level bit 0 mask. */
+#define PORT_INT0LVL0_bp  0  /* Port Interrupt 0 Level bit 0 position. */
+#define PORT_INT0LVL1_bm  (1<<1)  /* Port Interrupt 0 Level bit 1 mask. */
+#define PORT_INT0LVL1_bp  1  /* Port Interrupt 0 Level bit 1 position. */
+
+/* PORT.INTFLAGS  bit masks and bit positions */
+#define PORT_INT1IF_bm  0x02  /* Port Interrupt 1 Flag bit mask. */
+#define PORT_INT1IF_bp  1  /* Port Interrupt 1 Flag bit position. */
+
+#define PORT_INT0IF_bm  0x01  /* Port Interrupt 0 Flag bit mask. */
+#define PORT_INT0IF_bp  0  /* Port Interrupt 0 Flag bit position. */
+
+/* PORT.REMAP  bit masks and bit positions */
+#define PORT_SPI_bm  0x20  /* SPI bit mask. */
+#define PORT_SPI_bp  5  /* SPI bit position. */
+
+#define PORT_USART0_bm  0x10  /* USART0 bit mask. */
+#define PORT_USART0_bp  4  /* USART0 bit position. */
+
+#define PORT_TC0D_bm  0x08  /* Timer/Counter 0 Output Compare D bit mask. */
+#define PORT_TC0D_bp  3  /* Timer/Counter 0 Output Compare D bit position. */
+
+#define PORT_TC0C_bm  0x04  /* Timer/Counter 0 Output Compare C bit mask. */
+#define PORT_TC0C_bp  2  /* Timer/Counter 0 Output Compare C bit position. */
+
+#define PORT_TC0B_bm  0x02  /* Timer/Counter 0 Output Compare B bit mask. */
+#define PORT_TC0B_bp  1  /* Timer/Counter 0 Output Compare B bit position. */
+
+#define PORT_TC0A_bm  0x01  /* Timer/Counter 0 Output Compare A bit mask. */
+#define PORT_TC0A_bp  0  /* Timer/Counter 0 Output Compare A bit position. */
+
+/* PORT.PIN0CTRL  bit masks and bit positions */
+#define PORT_SRLEN_bm  0x80  /* Slew Rate Enable bit mask. */
+#define PORT_SRLEN_bp  7  /* Slew Rate Enable bit position. */
+
+#define PORT_INVEN_bm  0x40  /* Inverted I/O Enable bit mask. */
+#define PORT_INVEN_bp  6  /* Inverted I/O Enable bit position. */
+
+#define PORT_OPC_gm  0x38  /* Output/Pull Configuration group mask. */
+#define PORT_OPC_gp  3  /* Output/Pull Configuration group position. */
+#define PORT_OPC0_bm  (1<<3)  /* Output/Pull Configuration bit 0 mask. */
+#define PORT_OPC0_bp  3  /* Output/Pull Configuration bit 0 position. */
+#define PORT_OPC1_bm  (1<<4)  /* Output/Pull Configuration bit 1 mask. */
+#define PORT_OPC1_bp  4  /* Output/Pull Configuration bit 1 position. */
+#define PORT_OPC2_bm  (1<<5)  /* Output/Pull Configuration bit 2 mask. */
+#define PORT_OPC2_bp  5  /* Output/Pull Configuration bit 2 position. */
+
+#define PORT_ISC_gm  0x07  /* Input/Sense Configuration group mask. */
+#define PORT_ISC_gp  0  /* Input/Sense Configuration group position. */
+#define PORT_ISC0_bm  (1<<0)  /* Input/Sense Configuration bit 0 mask. */
+#define PORT_ISC0_bp  0  /* Input/Sense Configuration bit 0 position. */
+#define PORT_ISC1_bm  (1<<1)  /* Input/Sense Configuration bit 1 mask. */
+#define PORT_ISC1_bp  1  /* Input/Sense Configuration bit 1 position. */
+#define PORT_ISC2_bm  (1<<2)  /* Input/Sense Configuration bit 2 mask. */
+#define PORT_ISC2_bp  2  /* Input/Sense Configuration bit 2 position. */
+
+/* PORT.PIN1CTRL  bit masks and bit positions */
+/* PORT_SRLEN  Predefined. */
+/* PORT_SRLEN  Predefined. */
+
+/* PORT_INVEN  Predefined. */
+/* PORT_INVEN  Predefined. */
+
+/* PORT_OPC  Predefined. */
+/* PORT_OPC  Predefined. */
+
+/* PORT_ISC  Predefined. */
+/* PORT_ISC  Predefined. */
+
+/* PORT.PIN2CTRL  bit masks and bit positions */
+/* PORT_SRLEN  Predefined. */
+/* PORT_SRLEN  Predefined. */
+
+/* PORT_INVEN  Predefined. */
+/* PORT_INVEN  Predefined. */
+
+/* PORT_OPC  Predefined. */
+/* PORT_OPC  Predefined. */
+
+/* PORT_ISC  Predefined. */
+/* PORT_ISC  Predefined. */
+
+/* PORT.PIN3CTRL  bit masks and bit positions */
+/* PORT_SRLEN  Predefined. */
+/* PORT_SRLEN  Predefined. */
+
+/* PORT_INVEN  Predefined. */
+/* PORT_INVEN  Predefined. */
+
+/* PORT_OPC  Predefined. */
+/* PORT_OPC  Predefined. */
+
+/* PORT_ISC  Predefined. */
+/* PORT_ISC  Predefined. */
+
+/* PORT.PIN4CTRL  bit masks and bit positions */
+/* PORT_SRLEN  Predefined. */
+/* PORT_SRLEN  Predefined. */
+
+/* PORT_INVEN  Predefined. */
+/* PORT_INVEN  Predefined. */
+
+/* PORT_OPC  Predefined. */
+/* PORT_OPC  Predefined. */
+
+/* PORT_ISC  Predefined. */
+/* PORT_ISC  Predefined. */
+
+/* PORT.PIN5CTRL  bit masks and bit positions */
+/* PORT_SRLEN  Predefined. */
+/* PORT_SRLEN  Predefined. */
+
+/* PORT_INVEN  Predefined. */
+/* PORT_INVEN  Predefined. */
+
+/* PORT_OPC  Predefined. */
+/* PORT_OPC  Predefined. */
+
+/* PORT_ISC  Predefined. */
+/* PORT_ISC  Predefined. */
+
+/* PORT.PIN6CTRL  bit masks and bit positions */
+/* PORT_SRLEN  Predefined. */
+/* PORT_SRLEN  Predefined. */
+
+/* PORT_INVEN  Predefined. */
+/* PORT_INVEN  Predefined. */
+
+/* PORT_OPC  Predefined. */
+/* PORT_OPC  Predefined. */
+
+/* PORT_ISC  Predefined. */
+/* PORT_ISC  Predefined. */
+
+/* PORT.PIN7CTRL  bit masks and bit positions */
+/* PORT_SRLEN  Predefined. */
+/* PORT_SRLEN  Predefined. */
+
+/* PORT_INVEN  Predefined. */
+/* PORT_INVEN  Predefined. */
+
+/* PORT_OPC  Predefined. */
+/* PORT_OPC  Predefined. */
+
+/* PORT_ISC  Predefined. */
+/* PORT_ISC  Predefined. */
+
+/* TC - 16-bit Timer/Counter With PWM */
+/* TC0.CTRLA  bit masks and bit positions */
+#define TC0_CLKSEL_gm  0x0F  /* Clock Selection group mask. */
+#define TC0_CLKSEL_gp  0  /* Clock Selection group position. */
+#define TC0_CLKSEL0_bm  (1<<0)  /* Clock Selection bit 0 mask. */
+#define TC0_CLKSEL0_bp  0  /* Clock Selection bit 0 position. */
+#define TC0_CLKSEL1_bm  (1<<1)  /* Clock Selection bit 1 mask. */
+#define TC0_CLKSEL1_bp  1  /* Clock Selection bit 1 position. */
+#define TC0_CLKSEL2_bm  (1<<2)  /* Clock Selection bit 2 mask. */
+#define TC0_CLKSEL2_bp  2  /* Clock Selection bit 2 position. */
+#define TC0_CLKSEL3_bm  (1<<3)  /* Clock Selection bit 3 mask. */
+#define TC0_CLKSEL3_bp  3  /* Clock Selection bit 3 position. */
+
+/* TC0.CTRLB  bit masks and bit positions */
+#define TC0_CCDEN_bm  0x80  /* Compare or Capture D Enable bit mask. */
+#define TC0_CCDEN_bp  7  /* Compare or Capture D Enable bit position. */
+
+#define TC0_CCCEN_bm  0x40  /* Compare or Capture C Enable bit mask. */
+#define TC0_CCCEN_bp  6  /* Compare or Capture C Enable bit position. */
+
+#define TC0_CCBEN_bm  0x20  /* Compare or Capture B Enable bit mask. */
+#define TC0_CCBEN_bp  5  /* Compare or Capture B Enable bit position. */
+
+#define TC0_CCAEN_bm  0x10  /* Compare or Capture A Enable bit mask. */
+#define TC0_CCAEN_bp  4  /* Compare or Capture A Enable bit position. */
+
+#define TC0_WGMODE_gm  0x07  /* Waveform generation mode group mask. */
+#define TC0_WGMODE_gp  0  /* Waveform generation mode group position. */
+#define TC0_WGMODE0_bm  (1<<0)  /* Waveform generation mode bit 0 mask. */
+#define TC0_WGMODE0_bp  0  /* Waveform generation mode bit 0 position. */
+#define TC0_WGMODE1_bm  (1<<1)  /* Waveform generation mode bit 1 mask. */
+#define TC0_WGMODE1_bp  1  /* Waveform generation mode bit 1 position. */
+#define TC0_WGMODE2_bm  (1<<2)  /* Waveform generation mode bit 2 mask. */
+#define TC0_WGMODE2_bp  2  /* Waveform generation mode bit 2 position. */
+
+/* TC0.CTRLC  bit masks and bit positions */
+#define TC0_CMPD_bm  0x08  /* Compare D Output Value bit mask. */
+#define TC0_CMPD_bp  3  /* Compare D Output Value bit position. */
+
+#define TC0_CMPC_bm  0x04  /* Compare C Output Value bit mask. */
+#define TC0_CMPC_bp  2  /* Compare C Output Value bit position. */
+
+#define TC0_CMPB_bm  0x02  /* Compare B Output Value bit mask. */
+#define TC0_CMPB_bp  1  /* Compare B Output Value bit position. */
+
+#define TC0_CMPA_bm  0x01  /* Compare A Output Value bit mask. */
+#define TC0_CMPA_bp  0  /* Compare A Output Value bit position. */
+
+/* TC0.CTRLD  bit masks and bit positions */
+#define TC0_EVACT_gm  0xE0  /* Event Action group mask. */
+#define TC0_EVACT_gp  5  /* Event Action group position. */
+#define TC0_EVACT0_bm  (1<<5)  /* Event Action bit 0 mask. */
+#define TC0_EVACT0_bp  5  /* Event Action bit 0 position. */
+#define TC0_EVACT1_bm  (1<<6)  /* Event Action bit 1 mask. */
+#define TC0_EVACT1_bp  6  /* Event Action bit 1 position. */
+#define TC0_EVACT2_bm  (1<<7)  /* Event Action bit 2 mask. */
+#define TC0_EVACT2_bp  7  /* Event Action bit 2 position. */
+
+#define TC0_EVDLY_bm  0x10  /* Event Delay bit mask. */
+#define TC0_EVDLY_bp  4  /* Event Delay bit position. */
+
+#define TC0_EVSEL_gm  0x0F  /* Event Source Select group mask. */
+#define TC0_EVSEL_gp  0  /* Event Source Select group position. */
+#define TC0_EVSEL0_bm  (1<<0)  /* Event Source Select bit 0 mask. */
+#define TC0_EVSEL0_bp  0  /* Event Source Select bit 0 position. */
+#define TC0_EVSEL1_bm  (1<<1)  /* Event Source Select bit 1 mask. */
+#define TC0_EVSEL1_bp  1  /* Event Source Select bit 1 position. */
+#define TC0_EVSEL2_bm  (1<<2)  /* Event Source Select bit 2 mask. */
+#define TC0_EVSEL2_bp  2  /* Event Source Select bit 2 position. */
+#define TC0_EVSEL3_bm  (1<<3)  /* Event Source Select bit 3 mask. */
+#define TC0_EVSEL3_bp  3  /* Event Source Select bit 3 position. */
+
+/* TC0.CTRLE  bit masks and bit positions */
+#define TC0_BYTEM_gm  0x03  /* Byte Mode group mask. */
+#define TC0_BYTEM_gp  0  /* Byte Mode group position. */
+#define TC0_BYTEM0_bm  (1<<0)  /* Byte Mode bit 0 mask. */
+#define TC0_BYTEM0_bp  0  /* Byte Mode bit 0 position. */
+#define TC0_BYTEM1_bm  (1<<1)  /* Byte Mode bit 1 mask. */
+#define TC0_BYTEM1_bp  1  /* Byte Mode bit 1 position. */
+
+/* TC0.INTCTRLA  bit masks and bit positions */
+#define TC0_ERRINTLVL_gm  0x0C  /* Error Interrupt Level group mask. */
+#define TC0_ERRINTLVL_gp  2  /* Error Interrupt Level group position. */
+#define TC0_ERRINTLVL0_bm  (1<<2)  /* Error Interrupt Level bit 0 mask. */
+#define TC0_ERRINTLVL0_bp  2  /* Error Interrupt Level bit 0 position. */
+#define TC0_ERRINTLVL1_bm  (1<<3)  /* Error Interrupt Level bit 1 mask. */
+#define TC0_ERRINTLVL1_bp  3  /* Error Interrupt Level bit 1 position. */
+
+#define TC0_OVFINTLVL_gm  0x03  /* Overflow interrupt level group mask. */
+#define TC0_OVFINTLVL_gp  0  /* Overflow interrupt level group position. */
+#define TC0_OVFINTLVL0_bm  (1<<0)  /* Overflow interrupt level bit 0 mask. */
+#define TC0_OVFINTLVL0_bp  0  /* Overflow interrupt level bit 0 position. */
+#define TC0_OVFINTLVL1_bm  (1<<1)  /* Overflow interrupt level bit 1 mask. */
+#define TC0_OVFINTLVL1_bp  1  /* Overflow interrupt level bit 1 position. */
+
+/* TC0.INTCTRLB  bit masks and bit positions */
+#define TC0_CCDINTLVL_gm  0xC0  /* Compare or Capture D Interrupt Level group mask. */
+#define TC0_CCDINTLVL_gp  6  /* Compare or Capture D Interrupt Level group position. */
+#define TC0_CCDINTLVL0_bm  (1<<6)  /* Compare or Capture D Interrupt Level bit 0 mask. */
+#define TC0_CCDINTLVL0_bp  6  /* Compare or Capture D Interrupt Level bit 0 position. */
+#define TC0_CCDINTLVL1_bm  (1<<7)  /* Compare or Capture D Interrupt Level bit 1 mask. */
+#define TC0_CCDINTLVL1_bp  7  /* Compare or Capture D Interrupt Level bit 1 position. */
+
+#define TC0_CCCINTLVL_gm  0x30  /* Compare or Capture C Interrupt Level group mask. */
+#define TC0_CCCINTLVL_gp  4  /* Compare or Capture C Interrupt Level group position. */
+#define TC0_CCCINTLVL0_bm  (1<<4)  /* Compare or Capture C Interrupt Level bit 0 mask. */
+#define TC0_CCCINTLVL0_bp  4  /* Compare or Capture C Interrupt Level bit 0 position. */
+#define TC0_CCCINTLVL1_bm  (1<<5)  /* Compare or Capture C Interrupt Level bit 1 mask. */
+#define TC0_CCCINTLVL1_bp  5  /* Compare or Capture C Interrupt Level bit 1 position. */
+
+#define TC0_CCBINTLVL_gm  0x0C  /* Compare or Capture B Interrupt Level group mask. */
+#define TC0_CCBINTLVL_gp  2  /* Compare or Capture B Interrupt Level group position. */
+#define TC0_CCBINTLVL0_bm  (1<<2)  /* Compare or Capture B Interrupt Level bit 0 mask. */
+#define TC0_CCBINTLVL0_bp  2  /* Compare or Capture B Interrupt Level bit 0 position. */
+#define TC0_CCBINTLVL1_bm  (1<<3)  /* Compare or Capture B Interrupt Level bit 1 mask. */
+#define TC0_CCBINTLVL1_bp  3  /* Compare or Capture B Interrupt Level bit 1 position. */
+
+#define TC0_CCAINTLVL_gm  0x03  /* Compare or Capture A Interrupt Level group mask. */
+#define TC0_CCAINTLVL_gp  0  /* Compare or Capture A Interrupt Level group position. */
+#define TC0_CCAINTLVL0_bm  (1<<0)  /* Compare or Capture A Interrupt Level bit 0 mask. */
+#define TC0_CCAINTLVL0_bp  0  /* Compare or Capture A Interrupt Level bit 0 position. */
+#define TC0_CCAINTLVL1_bm  (1<<1)  /* Compare or Capture A Interrupt Level bit 1 mask. */
+#define TC0_CCAINTLVL1_bp  1  /* Compare or Capture A Interrupt Level bit 1 position. */
+
+/* TC0.CTRLFCLR  bit masks and bit positions */
+#define TC0_CMD_gm  0x0C  /* Command group mask. */
+#define TC0_CMD_gp  2  /* Command group position. */
+#define TC0_CMD0_bm  (1<<2)  /* Command bit 0 mask. */
+#define TC0_CMD0_bp  2  /* Command bit 0 position. */
+#define TC0_CMD1_bm  (1<<3)  /* Command bit 1 mask. */
+#define TC0_CMD1_bp  3  /* Command bit 1 position. */
+
+#define TC0_LUPD_bm  0x02  /* Lock Update bit mask. */
+#define TC0_LUPD_bp  1  /* Lock Update bit position. */
+
+#define TC0_DIR_bm  0x01  /* Direction bit mask. */
+#define TC0_DIR_bp  0  /* Direction bit position. */
+
+/* TC0.CTRLFSET  bit masks and bit positions */
+/* TC0_CMD  Predefined. */
+/* TC0_CMD  Predefined. */
+
+/* TC0_LUPD  Predefined. */
+/* TC0_LUPD  Predefined. */
+
+/* TC0_DIR  Predefined. */
+/* TC0_DIR  Predefined. */
+
+/* TC0.CTRLGCLR  bit masks and bit positions */
+#define TC0_CCDBV_bm  0x10  /* Compare or Capture D Buffer Valid bit mask. */
+#define TC0_CCDBV_bp  4  /* Compare or Capture D Buffer Valid bit position. */
+
+#define TC0_CCCBV_bm  0x08  /* Compare or Capture C Buffer Valid bit mask. */
+#define TC0_CCCBV_bp  3  /* Compare or Capture C Buffer Valid bit position. */
+
+#define TC0_CCBBV_bm  0x04  /* Compare or Capture B Buffer Valid bit mask. */
+#define TC0_CCBBV_bp  2  /* Compare or Capture B Buffer Valid bit position. */
+
+#define TC0_CCABV_bm  0x02  /* Compare or Capture A Buffer Valid bit mask. */
+#define TC0_CCABV_bp  1  /* Compare or Capture A Buffer Valid bit position. */
+
+#define TC0_PERBV_bm  0x01  /* Period Buffer Valid bit mask. */
+#define TC0_PERBV_bp  0  /* Period Buffer Valid bit position. */
+
+/* TC0.CTRLGSET  bit masks and bit positions */
+/* TC0_CCDBV  Predefined. */
+/* TC0_CCDBV  Predefined. */
+
+/* TC0_CCCBV  Predefined. */
+/* TC0_CCCBV  Predefined. */
+
+/* TC0_CCBBV  Predefined. */
+/* TC0_CCBBV  Predefined. */
+
+/* TC0_CCABV  Predefined. */
+/* TC0_CCABV  Predefined. */
+
+/* TC0_PERBV  Predefined. */
+/* TC0_PERBV  Predefined. */
+
+/* TC0.INTFLAGS  bit masks and bit positions */
+#define TC0_CCDIF_bm  0x80  /* Compare or Capture D Interrupt Flag bit mask. */
+#define TC0_CCDIF_bp  7  /* Compare or Capture D Interrupt Flag bit position. */
+
+#define TC0_CCCIF_bm  0x40  /* Compare or Capture C Interrupt Flag bit mask. */
+#define TC0_CCCIF_bp  6  /* Compare or Capture C Interrupt Flag bit position. */
+
+#define TC0_CCBIF_bm  0x20  /* Compare or Capture B Interrupt Flag bit mask. */
+#define TC0_CCBIF_bp  5  /* Compare or Capture B Interrupt Flag bit position. */
+
+#define TC0_CCAIF_bm  0x10  /* Compare or Capture A Interrupt Flag bit mask. */
+#define TC0_CCAIF_bp  4  /* Compare or Capture A Interrupt Flag bit position. */
+
+#define TC0_ERRIF_bm  0x02  /* Error Interrupt Flag bit mask. */
+#define TC0_ERRIF_bp  1  /* Error Interrupt Flag bit position. */
+
+#define TC0_OVFIF_bm  0x01  /* Overflow Interrupt Flag bit mask. */
+#define TC0_OVFIF_bp  0  /* Overflow Interrupt Flag bit position. */
+
+/* TC1.CTRLA  bit masks and bit positions */
+#define TC1_CLKSEL_gm  0x0F  /* Clock Selection group mask. */
+#define TC1_CLKSEL_gp  0  /* Clock Selection group position. */
+#define TC1_CLKSEL0_bm  (1<<0)  /* Clock Selection bit 0 mask. */
+#define TC1_CLKSEL0_bp  0  /* Clock Selection bit 0 position. */
+#define TC1_CLKSEL1_bm  (1<<1)  /* Clock Selection bit 1 mask. */
+#define TC1_CLKSEL1_bp  1  /* Clock Selection bit 1 position. */
+#define TC1_CLKSEL2_bm  (1<<2)  /* Clock Selection bit 2 mask. */
+#define TC1_CLKSEL2_bp  2  /* Clock Selection bit 2 position. */
+#define TC1_CLKSEL3_bm  (1<<3)  /* Clock Selection bit 3 mask. */
+#define TC1_CLKSEL3_bp  3  /* Clock Selection bit 3 position. */
+
+/* TC1.CTRLB  bit masks and bit positions */
+#define TC1_CCBEN_bm  0x20  /* Compare or Capture B Enable bit mask. */
+#define TC1_CCBEN_bp  5  /* Compare or Capture B Enable bit position. */
+
+#define TC1_CCAEN_bm  0x10  /* Compare or Capture A Enable bit mask. */
+#define TC1_CCAEN_bp  4  /* Compare or Capture A Enable bit position. */
+
+#define TC1_WGMODE_gm  0x07  /* Waveform generation mode group mask. */
+#define TC1_WGMODE_gp  0  /* Waveform generation mode group position. */
+#define TC1_WGMODE0_bm  (1<<0)  /* Waveform generation mode bit 0 mask. */
+#define TC1_WGMODE0_bp  0  /* Waveform generation mode bit 0 position. */
+#define TC1_WGMODE1_bm  (1<<1)  /* Waveform generation mode bit 1 mask. */
+#define TC1_WGMODE1_bp  1  /* Waveform generation mode bit 1 position. */
+#define TC1_WGMODE2_bm  (1<<2)  /* Waveform generation mode bit 2 mask. */
+#define TC1_WGMODE2_bp  2  /* Waveform generation mode bit 2 position. */
+
+/* TC1.CTRLC  bit masks and bit positions */
+#define TC1_CMPB_bm  0x02  /* Compare B Output Value bit mask. */
+#define TC1_CMPB_bp  1  /* Compare B Output Value bit position. */
+
+#define TC1_CMPA_bm  0x01  /* Compare A Output Value bit mask. */
+#define TC1_CMPA_bp  0  /* Compare A Output Value bit position. */
+
+/* TC1.CTRLD  bit masks and bit positions */
+#define TC1_EVACT_gm  0xE0  /* Event Action group mask. */
+#define TC1_EVACT_gp  5  /* Event Action group position. */
+#define TC1_EVACT0_bm  (1<<5)  /* Event Action bit 0 mask. */
+#define TC1_EVACT0_bp  5  /* Event Action bit 0 position. */
+#define TC1_EVACT1_bm  (1<<6)  /* Event Action bit 1 mask. */
+#define TC1_EVACT1_bp  6  /* Event Action bit 1 position. */
+#define TC1_EVACT2_bm  (1<<7)  /* Event Action bit 2 mask. */
+#define TC1_EVACT2_bp  7  /* Event Action bit 2 position. */
+
+#define TC1_EVDLY_bm  0x10  /* Event Delay bit mask. */
+#define TC1_EVDLY_bp  4  /* Event Delay bit position. */
+
+#define TC1_EVSEL_gm  0x0F  /* Event Source Select group mask. */
+#define TC1_EVSEL_gp  0  /* Event Source Select group position. */
+#define TC1_EVSEL0_bm  (1<<0)  /* Event Source Select bit 0 mask. */
+#define TC1_EVSEL0_bp  0  /* Event Source Select bit 0 position. */
+#define TC1_EVSEL1_bm  (1<<1)  /* Event Source Select bit 1 mask. */
+#define TC1_EVSEL1_bp  1  /* Event Source Select bit 1 position. */
+#define TC1_EVSEL2_bm  (1<<2)  /* Event Source Select bit 2 mask. */
+#define TC1_EVSEL2_bp  2  /* Event Source Select bit 2 position. */
+#define TC1_EVSEL3_bm  (1<<3)  /* Event Source Select bit 3 mask. */
+#define TC1_EVSEL3_bp  3  /* Event Source Select bit 3 position. */
+
+/* TC1.CTRLE  bit masks and bit positions */
+#define TC1_BYTEM_bm  0x01  /* Byte Mode bit mask. */
+#define TC1_BYTEM_bp  0  /* Byte Mode bit position. */
+
+/* TC1.INTCTRLA  bit masks and bit positions */
+#define TC1_ERRINTLVL_gm  0x0C  /* Error Interrupt Level group mask. */
+#define TC1_ERRINTLVL_gp  2  /* Error Interrupt Level group position. */
+#define TC1_ERRINTLVL0_bm  (1<<2)  /* Error Interrupt Level bit 0 mask. */
+#define TC1_ERRINTLVL0_bp  2  /* Error Interrupt Level bit 0 position. */
+#define TC1_ERRINTLVL1_bm  (1<<3)  /* Error Interrupt Level bit 1 mask. */
+#define TC1_ERRINTLVL1_bp  3  /* Error Interrupt Level bit 1 position. */
+
+#define TC1_OVFINTLVL_gm  0x03  /* Overflow interrupt level group mask. */
+#define TC1_OVFINTLVL_gp  0  /* Overflow interrupt level group position. */
+#define TC1_OVFINTLVL0_bm  (1<<0)  /* Overflow interrupt level bit 0 mask. */
+#define TC1_OVFINTLVL0_bp  0  /* Overflow interrupt level bit 0 position. */
+#define TC1_OVFINTLVL1_bm  (1<<1)  /* Overflow interrupt level bit 1 mask. */
+#define TC1_OVFINTLVL1_bp  1  /* Overflow interrupt level bit 1 position. */
+
+/* TC1.INTCTRLB  bit masks and bit positions */
+#define TC1_CCBINTLVL_gm  0x0C  /* Compare or Capture B Interrupt Level group mask. */
+#define TC1_CCBINTLVL_gp  2  /* Compare or Capture B Interrupt Level group position. */
+#define TC1_CCBINTLVL0_bm  (1<<2)  /* Compare or Capture B Interrupt Level bit 0 mask. */
+#define TC1_CCBINTLVL0_bp  2  /* Compare or Capture B Interrupt Level bit 0 position. */
+#define TC1_CCBINTLVL1_bm  (1<<3)  /* Compare or Capture B Interrupt Level bit 1 mask. */
+#define TC1_CCBINTLVL1_bp  3  /* Compare or Capture B Interrupt Level bit 1 position. */
+
+#define TC1_CCAINTLVL_gm  0x03  /* Compare or Capture A Interrupt Level group mask. */
+#define TC1_CCAINTLVL_gp  0  /* Compare or Capture A Interrupt Level group position. */
+#define TC1_CCAINTLVL0_bm  (1<<0)  /* Compare or Capture A Interrupt Level bit 0 mask. */
+#define TC1_CCAINTLVL0_bp  0  /* Compare or Capture A Interrupt Level bit 0 position. */
+#define TC1_CCAINTLVL1_bm  (1<<1)  /* Compare or Capture A Interrupt Level bit 1 mask. */
+#define TC1_CCAINTLVL1_bp  1  /* Compare or Capture A Interrupt Level bit 1 position. */
+
+/* TC1.CTRLFCLR  bit masks and bit positions */
+#define TC1_CMD_gm  0x0C  /* Command group mask. */
+#define TC1_CMD_gp  2  /* Command group position. */
+#define TC1_CMD0_bm  (1<<2)  /* Command bit 0 mask. */
+#define TC1_CMD0_bp  2  /* Command bit 0 position. */
+#define TC1_CMD1_bm  (1<<3)  /* Command bit 1 mask. */
+#define TC1_CMD1_bp  3  /* Command bit 1 position. */
+
+#define TC1_LUPD_bm  0x02  /* Lock Update bit mask. */
+#define TC1_LUPD_bp  1  /* Lock Update bit position. */
+
+#define TC1_DIR_bm  0x01  /* Direction bit mask. */
+#define TC1_DIR_bp  0  /* Direction bit position. */
+
+/* TC1.CTRLFSET  bit masks and bit positions */
+/* TC1_CMD  Predefined. */
+/* TC1_CMD  Predefined. */
+
+/* TC1_LUPD  Predefined. */
+/* TC1_LUPD  Predefined. */
+
+/* TC1_DIR  Predefined. */
+/* TC1_DIR  Predefined. */
+
+/* TC1.CTRLGCLR  bit masks and bit positions */
+#define TC1_CCBBV_bm  0x04  /* Compare or Capture B Buffer Valid bit mask. */
+#define TC1_CCBBV_bp  2  /* Compare or Capture B Buffer Valid bit position. */
+
+#define TC1_CCABV_bm  0x02  /* Compare or Capture A Buffer Valid bit mask. */
+#define TC1_CCABV_bp  1  /* Compare or Capture A Buffer Valid bit position. */
+
+#define TC1_PERBV_bm  0x01  /* Period Buffer Valid bit mask. */
+#define TC1_PERBV_bp  0  /* Period Buffer Valid bit position. */
+
+/* TC1.CTRLGSET  bit masks and bit positions */
+/* TC1_CCBBV  Predefined. */
+/* TC1_CCBBV  Predefined. */
+
+/* TC1_CCABV  Predefined. */
+/* TC1_CCABV  Predefined. */
+
+/* TC1_PERBV  Predefined. */
+/* TC1_PERBV  Predefined. */
+
+/* TC1.INTFLAGS  bit masks and bit positions */
+#define TC1_CCBIF_bm  0x20  /* Compare or Capture B Interrupt Flag bit mask. */
+#define TC1_CCBIF_bp  5  /* Compare or Capture B Interrupt Flag bit position. */
+
+#define TC1_CCAIF_bm  0x10  /* Compare or Capture A Interrupt Flag bit mask. */
+#define TC1_CCAIF_bp  4  /* Compare or Capture A Interrupt Flag bit position. */
+
+#define TC1_ERRIF_bm  0x02  /* Error Interrupt Flag bit mask. */
+#define TC1_ERRIF_bp  1  /* Error Interrupt Flag bit position. */
+
+#define TC1_OVFIF_bm  0x01  /* Overflow Interrupt Flag bit mask. */
+#define TC1_OVFIF_bp  0  /* Overflow Interrupt Flag bit position. */
+
+/* TC2 - 16-bit Timer/Counter type 2 */
+/* TC2.CTRLA  bit masks and bit positions */
+#define TC2_CLKSEL_gm  0x0F  /* Clock Selection group mask. */
+#define TC2_CLKSEL_gp  0  /* Clock Selection group position. */
+#define TC2_CLKSEL0_bm  (1<<0)  /* Clock Selection bit 0 mask. */
+#define TC2_CLKSEL0_bp  0  /* Clock Selection bit 0 position. */
+#define TC2_CLKSEL1_bm  (1<<1)  /* Clock Selection bit 1 mask. */
+#define TC2_CLKSEL1_bp  1  /* Clock Selection bit 1 position. */
+#define TC2_CLKSEL2_bm  (1<<2)  /* Clock Selection bit 2 mask. */
+#define TC2_CLKSEL2_bp  2  /* Clock Selection bit 2 position. */
+#define TC2_CLKSEL3_bm  (1<<3)  /* Clock Selection bit 3 mask. */
+#define TC2_CLKSEL3_bp  3  /* Clock Selection bit 3 position. */
+
+/* TC2.CTRLB  bit masks and bit positions */
+#define TC2_HCMPDEN_bm  0x80  /* High Byte Compare D Enable bit mask. */
+#define TC2_HCMPDEN_bp  7  /* High Byte Compare D Enable bit position. */
+
+#define TC2_HCMPCEN_bm  0x40  /* High Byte Compare C Enable bit mask. */
+#define TC2_HCMPCEN_bp  6  /* High Byte Compare C Enable bit position. */
+
+#define TC2_HCMPBEN_bm  0x20  /* High Byte Compare B Enable bit mask. */
+#define TC2_HCMPBEN_bp  5  /* High Byte Compare B Enable bit position. */
+
+#define TC2_HCMPAEN_bm  0x10  /* High Byte Compare A Enable bit mask. */
+#define TC2_HCMPAEN_bp  4  /* High Byte Compare A Enable bit position. */
+
+#define TC2_LCMPDEN_bm  0x08  /* Low Byte Compare D Enable bit mask. */
+#define TC2_LCMPDEN_bp  3  /* Low Byte Compare D Enable bit position. */
+
+#define TC2_LCMPCEN_bm  0x04  /* Low Byte Compare C Enable bit mask. */
+#define TC2_LCMPCEN_bp  2  /* Low Byte Compare C Enable bit position. */
+
+#define TC2_LCMPBEN_bm  0x02  /* Low Byte Compare B Enable bit mask. */
+#define TC2_LCMPBEN_bp  1  /* Low Byte Compare B Enable bit position. */
+
+#define TC2_LCMPAEN_bm  0x01  /* Low Byte Compare A Enable bit mask. */
+#define TC2_LCMPAEN_bp  0  /* Low Byte Compare A Enable bit position. */
+
+/* TC2.CTRLC  bit masks and bit positions */
+#define TC2_HCMPD_bm  0x80  /* High Byte Compare D Output Value bit mask. */
+#define TC2_HCMPD_bp  7  /* High Byte Compare D Output Value bit position. */
+
+#define TC2_HCMPC_bm  0x40  /* High Byte Compare C Output Value bit mask. */
+#define TC2_HCMPC_bp  6  /* High Byte Compare C Output Value bit position. */
+
+#define TC2_HCMPB_bm  0x20  /* High Byte Compare B Output Value bit mask. */
+#define TC2_HCMPB_bp  5  /* High Byte Compare B Output Value bit position. */
+
+#define TC2_HCMPA_bm  0x10  /* High Byte Compare A Output Value bit mask. */
+#define TC2_HCMPA_bp  4  /* High Byte Compare A Output Value bit position. */
+
+#define TC2_LCMPD_bm  0x08  /* Low Byte Compare D Output Value bit mask. */
+#define TC2_LCMPD_bp  3  /* Low Byte Compare D Output Value bit position. */
+
+#define TC2_LCMPC_bm  0x04  /* Low Byte Compare C Output Value bit mask. */
+#define TC2_LCMPC_bp  2  /* Low Byte Compare C Output Value bit position. */
+
+#define TC2_LCMPB_bm  0x02  /* Low Byte Compare B Output Value bit mask. */
+#define TC2_LCMPB_bp  1  /* Low Byte Compare B Output Value bit position. */
+
+#define TC2_LCMPA_bm  0x01  /* Low Byte Compare A Output Value bit mask. */
+#define TC2_LCMPA_bp  0  /* Low Byte Compare A Output Value bit position. */
+
+/* TC2.CTRLE  bit masks and bit positions */
+#define TC2_BYTEM_gm  0x03  /* Byte Mode group mask. */
+#define TC2_BYTEM_gp  0  /* Byte Mode group position. */
+#define TC2_BYTEM0_bm  (1<<0)  /* Byte Mode bit 0 mask. */
+#define TC2_BYTEM0_bp  0  /* Byte Mode bit 0 position. */
+#define TC2_BYTEM1_bm  (1<<1)  /* Byte Mode bit 1 mask. */
+#define TC2_BYTEM1_bp  1  /* Byte Mode bit 1 position. */
+
+/* TC2.INTCTRLA  bit masks and bit positions */
+#define TC2_HUNFINTLVL_gm  0x0C  /* High Byte Underflow Interrupt Level group mask. */
+#define TC2_HUNFINTLVL_gp  2  /* High Byte Underflow Interrupt Level group position. */
+#define TC2_HUNFINTLVL0_bm  (1<<2)  /* High Byte Underflow Interrupt Level bit 0 mask. */
+#define TC2_HUNFINTLVL0_bp  2  /* High Byte Underflow Interrupt Level bit 0 position. */
+#define TC2_HUNFINTLVL1_bm  (1<<3)  /* High Byte Underflow Interrupt Level bit 1 mask. */
+#define TC2_HUNFINTLVL1_bp  3  /* High Byte Underflow Interrupt Level bit 1 position. */
+
+#define TC2_LUNFINTLVL_gm  0x03  /* Low Byte Underflow interrupt level group mask. */
+#define TC2_LUNFINTLVL_gp  0  /* Low Byte Underflow interrupt level group position. */
+#define TC2_LUNFINTLVL0_bm  (1<<0)  /* Low Byte Underflow interrupt level bit 0 mask. */
+#define TC2_LUNFINTLVL0_bp  0  /* Low Byte Underflow interrupt level bit 0 position. */
+#define TC2_LUNFINTLVL1_bm  (1<<1)  /* Low Byte Underflow interrupt level bit 1 mask. */
+#define TC2_LUNFINTLVL1_bp  1  /* Low Byte Underflow interrupt level bit 1 position. */
+
+/* TC2.INTCTRLB  bit masks and bit positions */
+#define TC2_LCMPDINTLVL_gm  0xC0  /* Low Byte Compare D Interrupt Level group mask. */
+#define TC2_LCMPDINTLVL_gp  6  /* Low Byte Compare D Interrupt Level group position. */
+#define TC2_LCMPDINTLVL0_bm  (1<<6)  /* Low Byte Compare D Interrupt Level bit 0 mask. */
+#define TC2_LCMPDINTLVL0_bp  6  /* Low Byte Compare D Interrupt Level bit 0 position. */
+#define TC2_LCMPDINTLVL1_bm  (1<<7)  /* Low Byte Compare D Interrupt Level bit 1 mask. */
+#define TC2_LCMPDINTLVL1_bp  7  /* Low Byte Compare D Interrupt Level bit 1 position. */
+
+#define TC2_LCMPCINTLVL_gm  0x30  /* Low Byte Compare C Interrupt Level group mask. */
+#define TC2_LCMPCINTLVL_gp  4  /* Low Byte Compare C Interrupt Level group position. */
+#define TC2_LCMPCINTLVL0_bm  (1<<4)  /* Low Byte Compare C Interrupt Level bit 0 mask. */
+#define TC2_LCMPCINTLVL0_bp  4  /* Low Byte Compare C Interrupt Level bit 0 position. */
+#define TC2_LCMPCINTLVL1_bm  (1<<5)  /* Low Byte Compare C Interrupt Level bit 1 mask. */
+#define TC2_LCMPCINTLVL1_bp  5  /* Low Byte Compare C Interrupt Level bit 1 position. */
+
+#define TC2_LCMPBINTLVL_gm  0x0C  /* Low Byte Compare B Interrupt Level group mask. */
+#define TC2_LCMPBINTLVL_gp  2  /* Low Byte Compare B Interrupt Level group position. */
+#define TC2_LCMPBINTLVL0_bm  (1<<2)  /* Low Byte Compare B Interrupt Level bit 0 mask. */
+#define TC2_LCMPBINTLVL0_bp  2  /* Low Byte Compare B Interrupt Level bit 0 position. */
+#define TC2_LCMPBINTLVL1_bm  (1<<3)  /* Low Byte Compare B Interrupt Level bit 1 mask. */
+#define TC2_LCMPBINTLVL1_bp  3  /* Low Byte Compare B Interrupt Level bit 1 position. */
+
+#define TC2_LCMPAINTLVL_gm  0x03  /* Low Byte Compare A Interrupt Level group mask. */
+#define TC2_LCMPAINTLVL_gp  0  /* Low Byte Compare A Interrupt Level group position. */
+#define TC2_LCMPAINTLVL0_bm  (1<<0)  /* Low Byte Compare A Interrupt Level bit 0 mask. */
+#define TC2_LCMPAINTLVL0_bp  0  /* Low Byte Compare A Interrupt Level bit 0 position. */
+#define TC2_LCMPAINTLVL1_bm  (1<<1)  /* Low Byte Compare A Interrupt Level bit 1 mask. */
+#define TC2_LCMPAINTLVL1_bp  1  /* Low Byte Compare A Interrupt Level bit 1 position. */
+
+/* TC2.CTRLF  bit masks and bit positions */
+#define TC2_CMD_gm  0x0C  /* Command group mask. */
+#define TC2_CMD_gp  2  /* Command group position. */
+#define TC2_CMD0_bm  (1<<2)  /* Command bit 0 mask. */
+#define TC2_CMD0_bp  2  /* Command bit 0 position. */
+#define TC2_CMD1_bm  (1<<3)  /* Command bit 1 mask. */
+#define TC2_CMD1_bp  3  /* Command bit 1 position. */
+
+#define TC2_CMDEN_gm  0x03  /* Command Enable group mask. */
+#define TC2_CMDEN_gp  0  /* Command Enable group position. */
+#define TC2_CMDEN0_bm  (1<<0)  /* Command Enable bit 0 mask. */
+#define TC2_CMDEN0_bp  0  /* Command Enable bit 0 position. */
+#define TC2_CMDEN1_bm  (1<<1)  /* Command Enable bit 1 mask. */
+#define TC2_CMDEN1_bp  1  /* Command Enable bit 1 position. */
+
+/* TC2.INTFLAGS  bit masks and bit positions */
+#define TC2_LCMPDIF_bm  0x80  /* Low Byte Compare D Interrupt Flag bit mask. */
+#define TC2_LCMPDIF_bp  7  /* Low Byte Compare D Interrupt Flag bit position. */
+
+#define TC2_LCMPCIF_bm  0x40  /* Low Byte Compare C Interrupt Flag bit mask. */
+#define TC2_LCMPCIF_bp  6  /* Low Byte Compare C Interrupt Flag bit position. */
+
+#define TC2_LCMPBIF_bm  0x20  /* Low Byte Compare B Interrupt Flag bit mask. */
+#define TC2_LCMPBIF_bp  5  /* Low Byte Compare B Interrupt Flag bit position. */
+
+#define TC2_LCMPAIF_bm  0x10  /* Low Byte Compare A Interrupt Flag bit mask. */
+#define TC2_LCMPAIF_bp  4  /* Low Byte Compare A Interrupt Flag bit position. */
+
+#define TC2_HUNFIF_bm  0x02  /* High Byte Underflow Interrupt Flag bit mask. */
+#define TC2_HUNFIF_bp  1  /* High Byte Underflow Interrupt Flag bit position. */
+
+#define TC2_LUNFIF_bm  0x01  /* Low Byte Underflow Interrupt Flag bit mask. */
+#define TC2_LUNFIF_bp  0  /* Low Byte Underflow Interrupt Flag bit position. */
+
+/* AWEX - Timer/Counter Advanced Waveform Extension */
+/* AWEX.CTRL  bit masks and bit positions */
+#define AWEX_PGM_bm  0x20  /* Pattern Generation Mode bit mask. */
+#define AWEX_PGM_bp  5  /* Pattern Generation Mode bit position. */
+
+#define AWEX_CWCM_bm  0x10  /* Common Waveform Channel Mode bit mask. */
+#define AWEX_CWCM_bp  4  /* Common Waveform Channel Mode bit position. */
+
+#define AWEX_DTICCDEN_bm  0x08  /* Dead Time Insertion Compare Channel D Enable bit mask. */
+#define AWEX_DTICCDEN_bp  3  /* Dead Time Insertion Compare Channel D Enable bit position. */
+
+#define AWEX_DTICCCEN_bm  0x04  /* Dead Time Insertion Compare Channel C Enable bit mask. */
+#define AWEX_DTICCCEN_bp  2  /* Dead Time Insertion Compare Channel C Enable bit position. */
+
+#define AWEX_DTICCBEN_bm  0x02  /* Dead Time Insertion Compare Channel B Enable bit mask. */
+#define AWEX_DTICCBEN_bp  1  /* Dead Time Insertion Compare Channel B Enable bit position. */
+
+#define AWEX_DTICCAEN_bm  0x01  /* Dead Time Insertion Compare Channel A Enable bit mask. */
+#define AWEX_DTICCAEN_bp  0  /* Dead Time Insertion Compare Channel A Enable bit position. */
+
+/* AWEX.FDCTRL  bit masks and bit positions */
+#define AWEX_FDDBD_bm  0x10  /* Fault Detect on Disable Break Disable bit mask. */
+#define AWEX_FDDBD_bp  4  /* Fault Detect on Disable Break Disable bit position. */
+
+#define AWEX_FDMODE_bm  0x04  /* Fault Detect Mode bit mask. */
+#define AWEX_FDMODE_bp  2  /* Fault Detect Mode bit position. */
+
+#define AWEX_FDACT_gm  0x03  /* Fault Detect Action group mask. */
+#define AWEX_FDACT_gp  0  /* Fault Detect Action group position. */
+#define AWEX_FDACT0_bm  (1<<0)  /* Fault Detect Action bit 0 mask. */
+#define AWEX_FDACT0_bp  0  /* Fault Detect Action bit 0 position. */
+#define AWEX_FDACT1_bm  (1<<1)  /* Fault Detect Action bit 1 mask. */
+#define AWEX_FDACT1_bp  1  /* Fault Detect Action bit 1 position. */
+
+/* AWEX.STATUS  bit masks and bit positions */
+#define AWEX_FDF_bm  0x04  /* Fault Detect Flag bit mask. */
+#define AWEX_FDF_bp  2  /* Fault Detect Flag bit position. */
+
+#define AWEX_DTHSBUFV_bm  0x02  /* Dead Time High Side Buffer Valid bit mask. */
+#define AWEX_DTHSBUFV_bp  1  /* Dead Time High Side Buffer Valid bit position. */
+
+#define AWEX_DTLSBUFV_bm  0x01  /* Dead Time Low Side Buffer Valid bit mask. */
+#define AWEX_DTLSBUFV_bp  0  /* Dead Time Low Side Buffer Valid bit position. */
+
+/* AWEX.STATUSSET  bit masks and bit positions */
+/* AWEX_FDF  Predefined. */
+/* AWEX_FDF  Predefined. */
+
+/* AWEX_DTHSBUFV  Predefined. */
+/* AWEX_DTHSBUFV  Predefined. */
+
+/* AWEX_DTLSBUFV  Predefined. */
+/* AWEX_DTLSBUFV  Predefined. */
+
+/* HIRES - Timer/Counter High-Resolution Extension */
+/* HIRES.CTRLA  bit masks and bit positions */
+#define HIRES_HREN_gm  0x03  /* High Resolution Enable group mask. */
+#define HIRES_HREN_gp  0  /* High Resolution Enable group position. */
+#define HIRES_HREN0_bm  (1<<0)  /* High Resolution Enable bit 0 mask. */
+#define HIRES_HREN0_bp  0  /* High Resolution Enable bit 0 position. */
+#define HIRES_HREN1_bm  (1<<1)  /* High Resolution Enable bit 1 mask. */
+#define HIRES_HREN1_bp  1  /* High Resolution Enable bit 1 position. */
+
+/* USART - Universal Asynchronous Receiver-Transmitter */
+/* USART.STATUS  bit masks and bit positions */
+#define USART_RXCIF_bm  0x80  /* Receive Interrupt Flag bit mask. */
+#define USART_RXCIF_bp  7  /* Receive Interrupt Flag bit position. */
+
+#define USART_TXCIF_bm  0x40  /* Transmit Interrupt Flag bit mask. */
+#define USART_TXCIF_bp  6  /* Transmit Interrupt Flag bit position. */
+
+#define USART_DREIF_bm  0x20  /* Data Register Empty Flag bit mask. */
+#define USART_DREIF_bp  5  /* Data Register Empty Flag bit position. */
+
+#define USART_FERR_bm  0x10  /* Frame Error bit mask. */
+#define USART_FERR_bp  4  /* Frame Error bit position. */
+
+#define USART_BUFOVF_bm  0x08  /* Buffer Overflow bit mask. */
+#define USART_BUFOVF_bp  3  /* Buffer Overflow bit position. */
+
+#define USART_PERR_bm  0x04  /* Parity Error bit mask. */
+#define USART_PERR_bp  2  /* Parity Error bit position. */
+
+#define USART_RXB8_bm  0x01  /* Receive Bit 8 bit mask. */
+#define USART_RXB8_bp  0  /* Receive Bit 8 bit position. */
+
+/* USART.CTRLA  bit masks and bit positions */
+#define USART_RXCINTLVL_gm  0x30  /* Receive Interrupt Level group mask. */
+#define USART_RXCINTLVL_gp  4  /* Receive Interrupt Level group position. */
+#define USART_RXCINTLVL0_bm  (1<<4)  /* Receive Interrupt Level bit 0 mask. */
+#define USART_RXCINTLVL0_bp  4  /* Receive Interrupt Level bit 0 position. */
+#define USART_RXCINTLVL1_bm  (1<<5)  /* Receive Interrupt Level bit 1 mask. */
+#define USART_RXCINTLVL1_bp  5  /* Receive Interrupt Level bit 1 position. */
+
+#define USART_TXCINTLVL_gm  0x0C  /* Transmit Interrupt Level group mask. */
+#define USART_TXCINTLVL_gp  2  /* Transmit Interrupt Level group position. */
+#define USART_TXCINTLVL0_bm  (1<<2)  /* Transmit Interrupt Level bit 0 mask. */
+#define USART_TXCINTLVL0_bp  2  /* Transmit Interrupt Level bit 0 position. */
+#define USART_TXCINTLVL1_bm  (1<<3)  /* Transmit Interrupt Level bit 1 mask. */
+#define USART_TXCINTLVL1_bp  3  /* Transmit Interrupt Level bit 1 position. */
+
+#define USART_DREINTLVL_gm  0x03  /* Data Register Empty Interrupt Level group mask. */
+#define USART_DREINTLVL_gp  0  /* Data Register Empty Interrupt Level group position. */
+#define USART_DREINTLVL0_bm  (1<<0)  /* Data Register Empty Interrupt Level bit 0 mask. */
+#define USART_DREINTLVL0_bp  0  /* Data Register Empty Interrupt Level bit 0 position. */
+#define USART_DREINTLVL1_bm  (1<<1)  /* Data Register Empty Interrupt Level bit 1 mask. */
+#define USART_DREINTLVL1_bp  1  /* Data Register Empty Interrupt Level bit 1 position. */
+
+/* USART.CTRLB  bit masks and bit positions */
+#define USART_RXEN_bm  0x10  /* Receiver Enable bit mask. */
+#define USART_RXEN_bp  4  /* Receiver Enable bit position. */
+
+#define USART_TXEN_bm  0x08  /* Transmitter Enable bit mask. */
+#define USART_TXEN_bp  3  /* Transmitter Enable bit position. */
+
+#define USART_CLK2X_bm  0x04  /* Double transmission speed bit mask. */
+#define USART_CLK2X_bp  2  /* Double transmission speed bit position. */
+
+#define USART_MPCM_bm  0x02  /* Multi-processor Communication Mode bit mask. */
+#define USART_MPCM_bp  1  /* Multi-processor Communication Mode bit position. */
+
+#define USART_TXB8_bm  0x01  /* Transmit bit 8 bit mask. */
+#define USART_TXB8_bp  0  /* Transmit bit 8 bit position. */
+
+/* USART.CTRLC  bit masks and bit positions */
+#define USART_CMODE_gm  0xC0  /* Communication Mode group mask. */
+#define USART_CMODE_gp  6  /* Communication Mode group position. */
+#define USART_CMODE0_bm  (1<<6)  /* Communication Mode bit 0 mask. */
+#define USART_CMODE0_bp  6  /* Communication Mode bit 0 position. */
+#define USART_CMODE1_bm  (1<<7)  /* Communication Mode bit 1 mask. */
+#define USART_CMODE1_bp  7  /* Communication Mode bit 1 position. */
+
+#define USART_PMODE_gm  0x30  /* Parity Mode group mask. */
+#define USART_PMODE_gp  4  /* Parity Mode group position. */
+#define USART_PMODE0_bm  (1<<4)  /* Parity Mode bit 0 mask. */
+#define USART_PMODE0_bp  4  /* Parity Mode bit 0 position. */
+#define USART_PMODE1_bm  (1<<5)  /* Parity Mode bit 1 mask. */
+#define USART_PMODE1_bp  5  /* Parity Mode bit 1 position. */
+
+#define USART_SBMODE_bm  0x08  /* Stop Bit Mode bit mask. */
+#define USART_SBMODE_bp  3  /* Stop Bit Mode bit position. */
+
+#define USART_CHSIZE_gm  0x07  /* Character Size group mask. */
+#define USART_CHSIZE_gp  0  /* Character Size group position. */
+#define USART_CHSIZE0_bm  (1<<0)  /* Character Size bit 0 mask. */
+#define USART_CHSIZE0_bp  0  /* Character Size bit 0 position. */
+#define USART_CHSIZE1_bm  (1<<1)  /* Character Size bit 1 mask. */
+#define USART_CHSIZE1_bp  1  /* Character Size bit 1 position. */
+#define USART_CHSIZE2_bm  (1<<2)  /* Character Size bit 2 mask. */
+#define USART_CHSIZE2_bp  2  /* Character Size bit 2 position. */
+
+/* USART.BAUDCTRLA  bit masks and bit positions */
+#define USART_BSEL_gm  0xFF  /* Baud Rate Selection Bits [7:0] group mask. */
+#define USART_BSEL_gp  0  /* Baud Rate Selection Bits [7:0] group position. */
+#define USART_BSEL0_bm  (1<<0)  /* Baud Rate Selection Bits [7:0] bit 0 mask. */
+#define USART_BSEL0_bp  0  /* Baud Rate Selection Bits [7:0] bit 0 position. */
+#define USART_BSEL1_bm  (1<<1)  /* Baud Rate Selection Bits [7:0] bit 1 mask. */
+#define USART_BSEL1_bp  1  /* Baud Rate Selection Bits [7:0] bit 1 position. */
+#define USART_BSEL2_bm  (1<<2)  /* Baud Rate Selection Bits [7:0] bit 2 mask. */
+#define USART_BSEL2_bp  2  /* Baud Rate Selection Bits [7:0] bit 2 position. */
+#define USART_BSEL3_bm  (1<<3)  /* Baud Rate Selection Bits [7:0] bit 3 mask. */
+#define USART_BSEL3_bp  3  /* Baud Rate Selection Bits [7:0] bit 3 position. */
+#define USART_BSEL4_bm  (1<<4)  /* Baud Rate Selection Bits [7:0] bit 4 mask. */
+#define USART_BSEL4_bp  4  /* Baud Rate Selection Bits [7:0] bit 4 position. */
+#define USART_BSEL5_bm  (1<<5)  /* Baud Rate Selection Bits [7:0] bit 5 mask. */
+#define USART_BSEL5_bp  5  /* Baud Rate Selection Bits [7:0] bit 5 position. */
+#define USART_BSEL6_bm  (1<<6)  /* Baud Rate Selection Bits [7:0] bit 6 mask. */
+#define USART_BSEL6_bp  6  /* Baud Rate Selection Bits [7:0] bit 6 position. */
+#define USART_BSEL7_bm  (1<<7)  /* Baud Rate Selection Bits [7:0] bit 7 mask. */
+#define USART_BSEL7_bp  7  /* Baud Rate Selection Bits [7:0] bit 7 position. */
+
+/* USART.BAUDCTRLB  bit masks and bit positions */
+#define USART_BSCALE_gm  0xF0  /* Baud Rate Scale group mask. */
+#define USART_BSCALE_gp  4  /* Baud Rate Scale group position. */
+#define USART_BSCALE0_bm  (1<<4)  /* Baud Rate Scale bit 0 mask. */
+#define USART_BSCALE0_bp  4  /* Baud Rate Scale bit 0 position. */
+#define USART_BSCALE1_bm  (1<<5)  /* Baud Rate Scale bit 1 mask. */
+#define USART_BSCALE1_bp  5  /* Baud Rate Scale bit 1 position. */
+#define USART_BSCALE2_bm  (1<<6)  /* Baud Rate Scale bit 2 mask. */
+#define USART_BSCALE2_bp  6  /* Baud Rate Scale bit 2 position. */
+#define USART_BSCALE3_bm  (1<<7)  /* Baud Rate Scale bit 3 mask. */
+#define USART_BSCALE3_bp  7  /* Baud Rate Scale bit 3 position. */
+
+/* USART_BSEL  Predefined. */
+/* USART_BSEL  Predefined. */
+
+/* SPI - Serial Peripheral Interface */
+/* SPI.CTRL  bit masks and bit positions */
+#define SPI_CLK2X_bm  0x80  /* Enable Double Speed bit mask. */
+#define SPI_CLK2X_bp  7  /* Enable Double Speed bit position. */
+
+#define SPI_ENABLE_bm  0x40  /* Enable Module bit mask. */
+#define SPI_ENABLE_bp  6  /* Enable Module bit position. */
+
+#define SPI_DORD_bm  0x20  /* Data Order Setting bit mask. */
+#define SPI_DORD_bp  5  /* Data Order Setting bit position. */
+
+#define SPI_MASTER_bm  0x10  /* Master Operation Enable bit mask. */
+#define SPI_MASTER_bp  4  /* Master Operation Enable bit position. */
+
+#define SPI_MODE_gm  0x0C  /* SPI Mode group mask. */
+#define SPI_MODE_gp  2  /* SPI Mode group position. */
+#define SPI_MODE0_bm  (1<<2)  /* SPI Mode bit 0 mask. */
+#define SPI_MODE0_bp  2  /* SPI Mode bit 0 position. */
+#define SPI_MODE1_bm  (1<<3)  /* SPI Mode bit 1 mask. */
+#define SPI_MODE1_bp  3  /* SPI Mode bit 1 position. */
+
+#define SPI_PRESCALER_gm  0x03  /* Prescaler group mask. */
+#define SPI_PRESCALER_gp  0  /* Prescaler group position. */
+#define SPI_PRESCALER0_bm  (1<<0)  /* Prescaler bit 0 mask. */
+#define SPI_PRESCALER0_bp  0  /* Prescaler bit 0 position. */
+#define SPI_PRESCALER1_bm  (1<<1)  /* Prescaler bit 1 mask. */
+#define SPI_PRESCALER1_bp  1  /* Prescaler bit 1 position. */
+
+/* SPI.INTCTRL  bit masks and bit positions */
+#define SPI_INTLVL_gm  0x03  /* Interrupt level group mask. */
+#define SPI_INTLVL_gp  0  /* Interrupt level group position. */
+#define SPI_INTLVL0_bm  (1<<0)  /* Interrupt level bit 0 mask. */
+#define SPI_INTLVL0_bp  0  /* Interrupt level bit 0 position. */
+#define SPI_INTLVL1_bm  (1<<1)  /* Interrupt level bit 1 mask. */
+#define SPI_INTLVL1_bp  1  /* Interrupt level bit 1 position. */
+
+/* SPI.STATUS  bit masks and bit positions */
+#define SPI_IF_bm  0x80  /* Interrupt Flag bit mask. */
+#define SPI_IF_bp  7  /* Interrupt Flag bit position. */
+
+#define SPI_WRCOL_bm  0x40  /* Write Collision bit mask. */
+#define SPI_WRCOL_bp  6  /* Write Collision bit position. */
+
+/* IRCOM - IR Communication Module */
+/* IRCOM.CTRL  bit masks and bit positions */
+#define IRCOM_EVSEL_gm  0x0F  /* Event Channel Select group mask. */
+#define IRCOM_EVSEL_gp  0  /* Event Channel Select group position. */
+#define IRCOM_EVSEL0_bm  (1<<0)  /* Event Channel Select bit 0 mask. */
+#define IRCOM_EVSEL0_bp  0  /* Event Channel Select bit 0 position. */
+#define IRCOM_EVSEL1_bm  (1<<1)  /* Event Channel Select bit 1 mask. */
+#define IRCOM_EVSEL1_bp  1  /* Event Channel Select bit 1 position. */
+#define IRCOM_EVSEL2_bm  (1<<2)  /* Event Channel Select bit 2 mask. */
+#define IRCOM_EVSEL2_bp  2  /* Event Channel Select bit 2 position. */
+#define IRCOM_EVSEL3_bm  (1<<3)  /* Event Channel Select bit 3 mask. */
+#define IRCOM_EVSEL3_bp  3  /* Event Channel Select bit 3 position. */
+
+/* FUSE - Fuses and Lockbits */
+/* NVM_FUSES.FUSEBYTE0  bit masks and bit positions */
+#define NVM_FUSES_JTAGUSERID_gm  0xFF  /* JTAG User ID group mask. */
+#define NVM_FUSES_JTAGUSERID_gp  0  /* JTAG User ID group position. */
+#define NVM_FUSES_JTAGUSERID0_bm  (1<<0)  /* JTAG User ID bit 0 mask. */
+#define NVM_FUSES_JTAGUSERID0_bp  0  /* JTAG User ID bit 0 position. */
+#define NVM_FUSES_JTAGUSERID1_bm  (1<<1)  /* JTAG User ID bit 1 mask. */
+#define NVM_FUSES_JTAGUSERID1_bp  1  /* JTAG User ID bit 1 position. */
+#define NVM_FUSES_JTAGUSERID2_bm  (1<<2)  /* JTAG User ID bit 2 mask. */
+#define NVM_FUSES_JTAGUSERID2_bp  2  /* JTAG User ID bit 2 position. */
+#define NVM_FUSES_JTAGUSERID3_bm  (1<<3)  /* JTAG User ID bit 3 mask. */
+#define NVM_FUSES_JTAGUSERID3_bp  3  /* JTAG User ID bit 3 position. */
+#define NVM_FUSES_JTAGUSERID4_bm  (1<<4)  /* JTAG User ID bit 4 mask. */
+#define NVM_FUSES_JTAGUSERID4_bp  4  /* JTAG User ID bit 4 position. */
+#define NVM_FUSES_JTAGUSERID5_bm  (1<<5)  /* JTAG User ID bit 5 mask. */
+#define NVM_FUSES_JTAGUSERID5_bp  5  /* JTAG User ID bit 5 position. */
+#define NVM_FUSES_JTAGUSERID6_bm  (1<<6)  /* JTAG User ID bit 6 mask. */
+#define NVM_FUSES_JTAGUSERID6_bp  6  /* JTAG User ID bit 6 position. */
+#define NVM_FUSES_JTAGUSERID7_bm  (1<<7)  /* JTAG User ID bit 7 mask. */
+#define NVM_FUSES_JTAGUSERID7_bp  7  /* JTAG User ID bit 7 position. */
+
+/* NVM_FUSES.FUSEBYTE1  bit masks and bit positions */
+#define NVM_FUSES_WDWP_gm  0xF0  /* Watchdog Window Timeout Period group mask. */
+#define NVM_FUSES_WDWP_gp  4  /* Watchdog Window Timeout Period group position. */
+#define NVM_FUSES_WDWP0_bm  (1<<4)  /* Watchdog Window Timeout Period bit 0 mask. */
+#define NVM_FUSES_WDWP0_bp  4  /* Watchdog Window Timeout Period bit 0 position. */
+#define NVM_FUSES_WDWP1_bm  (1<<5)  /* Watchdog Window Timeout Period bit 1 mask. */
+#define NVM_FUSES_WDWP1_bp  5  /* Watchdog Window Timeout Period bit 1 position. */
+#define NVM_FUSES_WDWP2_bm  (1<<6)  /* Watchdog Window Timeout Period bit 2 mask. */
+#define NVM_FUSES_WDWP2_bp  6  /* Watchdog Window Timeout Period bit 2 position. */
+#define NVM_FUSES_WDWP3_bm  (1<<7)  /* Watchdog Window Timeout Period bit 3 mask. */
+#define NVM_FUSES_WDWP3_bp  7  /* Watchdog Window Timeout Period bit 3 position. */
+
+#define NVM_FUSES_WDP_gm  0x0F  /* Watchdog Timeout Period group mask. */
+#define NVM_FUSES_WDP_gp  0  /* Watchdog Timeout Period group position. */
+#define NVM_FUSES_WDP0_bm  (1<<0)  /* Watchdog Timeout Period bit 0 mask. */
+#define NVM_FUSES_WDP0_bp  0  /* Watchdog Timeout Period bit 0 position. */
+#define NVM_FUSES_WDP1_bm  (1<<1)  /* Watchdog Timeout Period bit 1 mask. */
+#define NVM_FUSES_WDP1_bp  1  /* Watchdog Timeout Period bit 1 position. */
+#define NVM_FUSES_WDP2_bm  (1<<2)  /* Watchdog Timeout Period bit 2 mask. */
+#define NVM_FUSES_WDP2_bp  2  /* Watchdog Timeout Period bit 2 position. */
+#define NVM_FUSES_WDP3_bm  (1<<3)  /* Watchdog Timeout Period bit 3 mask. */
+#define NVM_FUSES_WDP3_bp  3  /* Watchdog Timeout Period bit 3 position. */
+
+/* NVM_FUSES.FUSEBYTE2  bit masks and bit positions */
+#define NVM_FUSES_BOOTRST_bm  0x40  /* Boot Loader Section Reset Vector bit mask. */
+#define NVM_FUSES_BOOTRST_bp  6  /* Boot Loader Section Reset Vector bit position. */
+
+#define NVM_FUSES_TOSCSEL_bm  0x20  /* Timer Oscillator pin location bit mask. */
+#define NVM_FUSES_TOSCSEL_bp  5  /* Timer Oscillator pin location bit position. */
+
+#define NVM_FUSES_BODPD_gm  0x03  /* BOD Operation in Power-Down Mode group mask. */
+#define NVM_FUSES_BODPD_gp  0  /* BOD Operation in Power-Down Mode group position. */
+#define NVM_FUSES_BODPD0_bm  (1<<0)  /* BOD Operation in Power-Down Mode bit 0 mask. */
+#define NVM_FUSES_BODPD0_bp  0  /* BOD Operation in Power-Down Mode bit 0 position. */
+#define NVM_FUSES_BODPD1_bm  (1<<1)  /* BOD Operation in Power-Down Mode bit 1 mask. */
+#define NVM_FUSES_BODPD1_bp  1  /* BOD Operation in Power-Down Mode bit 1 position. */
+
+/* NVM_FUSES.FUSEBYTE4  bit masks and bit positions */
+#define NVM_FUSES_RSTDISBL_bm  0x10  /* External Reset Disable bit mask. */
+#define NVM_FUSES_RSTDISBL_bp  4  /* External Reset Disable bit position. */
+
+#define NVM_FUSES_SUT_gm  0x0C  /* Start-up Time group mask. */
+#define NVM_FUSES_SUT_gp  2  /* Start-up Time group position. */
+#define NVM_FUSES_SUT0_bm  (1<<2)  /* Start-up Time bit 0 mask. */
+#define NVM_FUSES_SUT0_bp  2  /* Start-up Time bit 0 position. */
+#define NVM_FUSES_SUT1_bm  (1<<3)  /* Start-up Time bit 1 mask. */
+#define NVM_FUSES_SUT1_bp  3  /* Start-up Time bit 1 position. */
+
+#define NVM_FUSES_WDLOCK_bm  0x02  /* Watchdog Timer Lock bit mask. */
+#define NVM_FUSES_WDLOCK_bp  1  /* Watchdog Timer Lock bit position. */
+
+#define NVM_FUSES_JTAGEN_bm  0x01  /* JTAG Interface Enable bit mask. */
+#define NVM_FUSES_JTAGEN_bp  0  /* JTAG Interface Enable bit position. */
+
+/* NVM_FUSES.FUSEBYTE5  bit masks and bit positions */
+#define NVM_FUSES_BODACT_gm  0x30  /* BOD Operation in Active Mode group mask. */
+#define NVM_FUSES_BODACT_gp  4  /* BOD Operation in Active Mode group position. */
+#define NVM_FUSES_BODACT0_bm  (1<<4)  /* BOD Operation in Active Mode bit 0 mask. */
+#define NVM_FUSES_BODACT0_bp  4  /* BOD Operation in Active Mode bit 0 position. */
+#define NVM_FUSES_BODACT1_bm  (1<<5)  /* BOD Operation in Active Mode bit 1 mask. */
+#define NVM_FUSES_BODACT1_bp  5  /* BOD Operation in Active Mode bit 1 position. */
+
+#define NVM_FUSES_EESAVE_bm  0x08  /* Preserve EEPROM Through Chip Erase bit mask. */
+#define NVM_FUSES_EESAVE_bp  3  /* Preserve EEPROM Through Chip Erase bit position. */
+
+#define NVM_FUSES_BODLVL_gm  0x07  /* Brownout Detection Voltage Level group mask. */
+#define NVM_FUSES_BODLVL_gp  0  /* Brownout Detection Voltage Level group position. */
+#define NVM_FUSES_BODLVL0_bm  (1<<0)  /* Brownout Detection Voltage Level bit 0 mask. */
+#define NVM_FUSES_BODLVL0_bp  0  /* Brownout Detection Voltage Level bit 0 position. */
+#define NVM_FUSES_BODLVL1_bm  (1<<1)  /* Brownout Detection Voltage Level bit 1 mask. */
+#define NVM_FUSES_BODLVL1_bp  1  /* Brownout Detection Voltage Level bit 1 position. */
+#define NVM_FUSES_BODLVL2_bm  (1<<2)  /* Brownout Detection Voltage Level bit 2 mask. */
+#define NVM_FUSES_BODLVL2_bp  2  /* Brownout Detection Voltage Level bit 2 position. */
+
+/* LOCKBIT - Fuses and Lockbits */
+/* NVM_LOCKBITS.LOCKBITS  bit masks and bit positions */
+#define NVM_LOCKBITS_BLBB_gm  0xC0  /* Boot Lock Bits - Boot Section group mask. */
+#define NVM_LOCKBITS_BLBB_gp  6  /* Boot Lock Bits - Boot Section group position. */
+#define NVM_LOCKBITS_BLBB0_bm  (1<<6)  /* Boot Lock Bits - Boot Section bit 0 mask. */
+#define NVM_LOCKBITS_BLBB0_bp  6  /* Boot Lock Bits - Boot Section bit 0 position. */
+#define NVM_LOCKBITS_BLBB1_bm  (1<<7)  /* Boot Lock Bits - Boot Section bit 1 mask. */
+#define NVM_LOCKBITS_BLBB1_bp  7  /* Boot Lock Bits - Boot Section bit 1 position. */
+
+#define NVM_LOCKBITS_BLBA_gm  0x30  /* Boot Lock Bits - Application Section group mask. */
+#define NVM_LOCKBITS_BLBA_gp  4  /* Boot Lock Bits - Application Section group position. */
+#define NVM_LOCKBITS_BLBA0_bm  (1<<4)  /* Boot Lock Bits - Application Section bit 0 mask. */
+#define NVM_LOCKBITS_BLBA0_bp  4  /* Boot Lock Bits - Application Section bit 0 position. */
+#define NVM_LOCKBITS_BLBA1_bm  (1<<5)  /* Boot Lock Bits - Application Section bit 1 mask. */
+#define NVM_LOCKBITS_BLBA1_bp  5  /* Boot Lock Bits - Application Section bit 1 position. */
+
+#define NVM_LOCKBITS_BLBAT_gm  0x0C  /* Boot Lock Bits - Application Table group mask. */
+#define NVM_LOCKBITS_BLBAT_gp  2  /* Boot Lock Bits - Application Table group position. */
+#define NVM_LOCKBITS_BLBAT0_bm  (1<<2)  /* Boot Lock Bits - Application Table bit 0 mask. */
+#define NVM_LOCKBITS_BLBAT0_bp  2  /* Boot Lock Bits - Application Table bit 0 position. */
+#define NVM_LOCKBITS_BLBAT1_bm  (1<<3)  /* Boot Lock Bits - Application Table bit 1 mask. */
+#define NVM_LOCKBITS_BLBAT1_bp  3  /* Boot Lock Bits - Application Table bit 1 position. */
+
+#define NVM_LOCKBITS_LB_gm  0x03  /* Lock Bits group mask. */
+#define NVM_LOCKBITS_LB_gp  0  /* Lock Bits group position. */
+#define NVM_LOCKBITS_LB0_bm  (1<<0)  /* Lock Bits bit 0 mask. */
+#define NVM_LOCKBITS_LB0_bp  0  /* Lock Bits bit 0 position. */
+#define NVM_LOCKBITS_LB1_bm  (1<<1)  /* Lock Bits bit 1 mask. */
+#define NVM_LOCKBITS_LB1_bp  1  /* Lock Bits bit 1 position. */
+
+
+
+// Generic Port Pins
+
+#define PIN0_bm 0x01
+#define PIN0_bp 0
+#define PIN1_bm 0x02
+#define PIN1_bp 1
+#define PIN2_bm 0x04
+#define PIN2_bp 2
+#define PIN3_bm 0x08
+#define PIN3_bp 3
+#define PIN4_bm 0x10
+#define PIN4_bp 4
+#define PIN5_bm 0x20
+#define PIN5_bp 5
+#define PIN6_bm 0x40
+#define PIN6_bp 6
+#define PIN7_bm 0x80
+#define PIN7_bp 7
+
+/* ========== Interrupt Vector Definitions ========== */
+/* Vector 0 is the reset vector */
+
+/* OSC interrupt vectors */
+#define OSC_OSCF_vect_num  1
+#define OSC_OSCF_vect      _VECTOR(1)  /* Oscillator Failure Interrupt (NMI) */
+
+/* PORTC interrupt vectors */
+#define PORTC_INT0_vect_num  2
+#define PORTC_INT0_vect      _VECTOR(2)  /* External Interrupt 0 */
+#define PORTC_INT1_vect_num  3
+#define PORTC_INT1_vect      _VECTOR(3)  /* External Interrupt 1 */
+
+/* PORTR interrupt vectors */
+#define PORTR_INT0_vect_num  4
+#define PORTR_INT0_vect      _VECTOR(4)  /* External Interrupt 0 */
+#define PORTR_INT1_vect_num  5
+#define PORTR_INT1_vect      _VECTOR(5)  /* External Interrupt 1 */
+
+/* DMA interrupt vectors */
+#define DMA_CH0_vect_num  6
+#define DMA_CH0_vect      _VECTOR(6)  /* Channel 0 Interrupt */
+#define DMA_CH1_vect_num  7
+#define DMA_CH1_vect      _VECTOR(7)  /* Channel 1 Interrupt */
+#define DMA_CH2_vect_num  8
+#define DMA_CH2_vect      _VECTOR(8)  /* Channel 2 Interrupt */
+#define DMA_CH3_vect_num  9
+#define DMA_CH3_vect      _VECTOR(9)  /* Channel 3 Interrupt */
+
+/* RTC interrupt vectors */
+#define RTC_OVF_vect_num  10
+#define RTC_OVF_vect      _VECTOR(10)  /* Overflow Interrupt */
+#define RTC_COMP_vect_num  11
+#define RTC_COMP_vect      _VECTOR(11)  /* Compare Interrupt */
+
+/* TWIC interrupt vectors */
+#define TWIC_TWIS_vect_num  12
+#define TWIC_TWIS_vect      _VECTOR(12)  /* TWI Slave Interrupt */
+#define TWIC_TWIM_vect_num  13
+#define TWIC_TWIM_vect      _VECTOR(13)  /* TWI Master Interrupt */
+
+/* TCC0 interrupt vectors */
+#define TCC0_OVF_vect_num  14
+#define TCC0_OVF_vect      _VECTOR(14)  /* Overflow Interrupt */
+
+/* TCC2 interrupt vectors */
+#define TCC2_LUNF_vect_num  14
+#define TCC2_LUNF_vect      _VECTOR(14)  /* Low Byte Underflow Interrupt */
+
+/* TCC0 interrupt vectors */
+#define TCC0_ERR_vect_num  15
+#define TCC0_ERR_vect      _VECTOR(15)  /* Error Interrupt */
+
+/* TCC2 interrupt vectors */
+#define TCC2_HUNF_vect_num  15
+#define TCC2_HUNF_vect      _VECTOR(15)  /* High Byte Underflow Interrupt */
+
+/* TCC0 interrupt vectors */
+#define TCC0_CCA_vect_num  16
+#define TCC0_CCA_vect      _VECTOR(16)  /* Compare or Capture A Interrupt */
+
+/* TCC2 interrupt vectors */
+#define TCC2_LCMPA_vect_num  16
+#define TCC2_LCMPA_vect      _VECTOR(16)  /* Low Byte Compare A Interrupt */
+
+/* TCC0 interrupt vectors */
+#define TCC0_CCB_vect_num  17
+#define TCC0_CCB_vect      _VECTOR(17)  /* Compare or Capture B Interrupt */
+
+/* TCC2 interrupt vectors */
+#define TCC2_LCMPB_vect_num  17
+#define TCC2_LCMPB_vect      _VECTOR(17)  /* Low Byte Compare B Interrupt */
+
+/* TCC0 interrupt vectors */
+#define TCC0_CCC_vect_num  18
+#define TCC0_CCC_vect      _VECTOR(18)  /* Compare or Capture C Interrupt */
+
+/* TCC2 interrupt vectors */
+#define TCC2_LCMPC_vect_num  18
+#define TCC2_LCMPC_vect      _VECTOR(18)  /* Low Byte Compare C Interrupt */
+
+/* TCC0 interrupt vectors */
+#define TCC0_CCD_vect_num  19
+#define TCC0_CCD_vect      _VECTOR(19)  /* Compare or Capture D Interrupt */
+
+/* TCC2 interrupt vectors */
+#define TCC2_LCMPD_vect_num  19
+#define TCC2_LCMPD_vect      _VECTOR(19)  /* Low Byte Compare D Interrupt */
+
+/* TCC1 interrupt vectors */
+#define TCC1_OVF_vect_num  20
+#define TCC1_OVF_vect      _VECTOR(20)  /* Overflow Interrupt */
+#define TCC1_ERR_vect_num  21
+#define TCC1_ERR_vect      _VECTOR(21)  /* Error Interrupt */
+#define TCC1_CCA_vect_num  22
+#define TCC1_CCA_vect      _VECTOR(22)  /* Compare or Capture A Interrupt */
+#define TCC1_CCB_vect_num  23
+#define TCC1_CCB_vect      _VECTOR(23)  /* Compare or Capture B Interrupt */
+
+/* SPIC interrupt vectors */
+#define SPIC_INT_vect_num  24
+#define SPIC_INT_vect      _VECTOR(24)  /* SPI Interrupt */
+
+/* USARTC0 interrupt vectors */
+#define USARTC0_RXC_vect_num  25
+#define USARTC0_RXC_vect      _VECTOR(25)  /* Reception Complete Interrupt */
+#define USARTC0_DRE_vect_num  26
+#define USARTC0_DRE_vect      _VECTOR(26)  /* Data Register Empty Interrupt */
+#define USARTC0_TXC_vect_num  27
+#define USARTC0_TXC_vect      _VECTOR(27)  /* Transmission Complete Interrupt */
+
+/* USARTC1 interrupt vectors */
+#define USARTC1_RXC_vect_num  28
+#define USARTC1_RXC_vect      _VECTOR(28)  /* Reception Complete Interrupt */
+#define USARTC1_DRE_vect_num  29
+#define USARTC1_DRE_vect      _VECTOR(29)  /* Data Register Empty Interrupt */
+#define USARTC1_TXC_vect_num  30
+#define USARTC1_TXC_vect      _VECTOR(30)  /* Transmission Complete Interrupt */
+
+/* AES interrupt vectors */
+#define AES_INT_vect_num  31
+#define AES_INT_vect      _VECTOR(31)  /* AES Interrupt */
+
+/* NVM interrupt vectors */
+#define NVM_EE_vect_num  32
+#define NVM_EE_vect      _VECTOR(32)  /* EE Interrupt */
+#define NVM_SPM_vect_num  33
+#define NVM_SPM_vect      _VECTOR(33)  /* SPM Interrupt */
+
+/* PORTB interrupt vectors */
+#define PORTB_INT0_vect_num  34
+#define PORTB_INT0_vect      _VECTOR(34)  /* External Interrupt 0 */
+#define PORTB_INT1_vect_num  35
+#define PORTB_INT1_vect      _VECTOR(35)  /* External Interrupt 1 */
+
+/* ACB interrupt vectors */
+#define ACB_AC0_vect_num  36
+#define ACB_AC0_vect      _VECTOR(36)  /* AC0 Interrupt */
+#define ACB_AC1_vect_num  37
+#define ACB_AC1_vect      _VECTOR(37)  /* AC1 Interrupt */
+#define ACB_ACW_vect_num  38
+#define ACB_ACW_vect      _VECTOR(38)  /* ACW Window Mode Interrupt */
+
+/* ADCB interrupt vectors */
+#define ADCB_CH0_vect_num  39
+#define ADCB_CH0_vect      _VECTOR(39)  /* Interrupt 0 */
+#define ADCB_CH1_vect_num  40
+#define ADCB_CH1_vect      _VECTOR(40)  /* Interrupt 1 */
+#define ADCB_CH2_vect_num  41
+#define ADCB_CH2_vect      _VECTOR(41)  /* Interrupt 2 */
+#define ADCB_CH3_vect_num  42
+#define ADCB_CH3_vect      _VECTOR(42)  /* Interrupt 3 */
+
+/* PORTE interrupt vectors */
+#define PORTE_INT0_vect_num  43
+#define PORTE_INT0_vect      _VECTOR(43)  /* External Interrupt 0 */
+#define PORTE_INT1_vect_num  44
+#define PORTE_INT1_vect      _VECTOR(44)  /* External Interrupt 1 */
+
+/* TWIE interrupt vectors */
+#define TWIE_TWIS_vect_num  45
+#define TWIE_TWIS_vect      _VECTOR(45)  /* TWI Slave Interrupt */
+#define TWIE_TWIM_vect_num  46
+#define TWIE_TWIM_vect      _VECTOR(46)  /* TWI Master Interrupt */
+
+/* TCE0 interrupt vectors */
+#define TCE0_OVF_vect_num  47
+#define TCE0_OVF_vect      _VECTOR(47)  /* Overflow Interrupt */
+
+/* TCE2 interrupt vectors */
+#define TCE2_LUNF_vect_num  47
+#define TCE2_LUNF_vect      _VECTOR(47)  /* Low Byte Underflow Interrupt */
+
+/* TCE0 interrupt vectors */
+#define TCE0_ERR_vect_num  48
+#define TCE0_ERR_vect      _VECTOR(48)  /* Error Interrupt */
+
+/* TCE2 interrupt vectors */
+#define TCE2_HUNF_vect_num  48
+#define TCE2_HUNF_vect      _VECTOR(48)  /* High Byte Underflow Interrupt */
+
+/* TCE0 interrupt vectors */
+#define TCE0_CCA_vect_num  49
+#define TCE0_CCA_vect      _VECTOR(49)  /* Compare or Capture A Interrupt */
+
+/* TCE2 interrupt vectors */
+#define TCE2_LCMPA_vect_num  49
+#define TCE2_LCMPA_vect      _VECTOR(49)  /* Low Byte Compare A Interrupt */
+
+/* TCE0 interrupt vectors */
+#define TCE0_CCB_vect_num  50
+#define TCE0_CCB_vect      _VECTOR(50)  /* Compare or Capture B Interrupt */
+
+/* TCE2 interrupt vectors */
+#define TCE2_LCMPB_vect_num  50
+#define TCE2_LCMPB_vect      _VECTOR(50)  /* Low Byte Compare B Interrupt */
+
+/* TCE0 interrupt vectors */
+#define TCE0_CCC_vect_num  51
+#define TCE0_CCC_vect      _VECTOR(51)  /* Compare or Capture C Interrupt */
+
+/* TCE2 interrupt vectors */
+#define TCE2_LCMPC_vect_num  51
+#define TCE2_LCMPC_vect      _VECTOR(51)  /* Low Byte Compare C Interrupt */
+
+/* TCE0 interrupt vectors */
+#define TCE0_CCD_vect_num  52
+#define TCE0_CCD_vect      _VECTOR(52)  /* Compare or Capture D Interrupt */
+
+/* TCE2 interrupt vectors */
+#define TCE2_LCMPD_vect_num  52
+#define TCE2_LCMPD_vect      _VECTOR(52)  /* Low Byte Compare D Interrupt */
+
+/* TCE1 interrupt vectors */
+#define TCE1_OVF_vect_num  53
+#define TCE1_OVF_vect      _VECTOR(53)  /* Overflow Interrupt */
+#define TCE1_ERR_vect_num  54
+#define TCE1_ERR_vect      _VECTOR(54)  /* Error Interrupt */
+#define TCE1_CCA_vect_num  55
+#define TCE1_CCA_vect      _VECTOR(55)  /* Compare or Capture A Interrupt */
+#define TCE1_CCB_vect_num  56
+#define TCE1_CCB_vect      _VECTOR(56)  /* Compare or Capture B Interrupt */
+
+/* SPIE interrupt vectors */
+#define SPIE_INT_vect_num  57
+#define SPIE_INT_vect      _VECTOR(57)  /* SPI Interrupt */
+
+/* USARTE0 interrupt vectors */
+#define USARTE0_RXC_vect_num  58
+#define USARTE0_RXC_vect      _VECTOR(58)  /* Reception Complete Interrupt */
+#define USARTE0_DRE_vect_num  59
+#define USARTE0_DRE_vect      _VECTOR(59)  /* Data Register Empty Interrupt */
+#define USARTE0_TXC_vect_num  60
+#define USARTE0_TXC_vect      _VECTOR(60)  /* Transmission Complete Interrupt */
+
+/* USARTE1 interrupt vectors */
+#define USARTE1_RXC_vect_num  61
+#define USARTE1_RXC_vect      _VECTOR(61)  /* Reception Complete Interrupt */
+#define USARTE1_DRE_vect_num  62
+#define USARTE1_DRE_vect      _VECTOR(62)  /* Data Register Empty Interrupt */
+#define USARTE1_TXC_vect_num  63
+#define USARTE1_TXC_vect      _VECTOR(63)  /* Transmission Complete Interrupt */
+
+/* PORTD interrupt vectors */
+#define PORTD_INT0_vect_num  64
+#define PORTD_INT0_vect      _VECTOR(64)  /* External Interrupt 0 */
+#define PORTD_INT1_vect_num  65
+#define PORTD_INT1_vect      _VECTOR(65)  /* External Interrupt 1 */
+
+/* PORTA interrupt vectors */
+#define PORTA_INT0_vect_num  66
+#define PORTA_INT0_vect      _VECTOR(66)  /* External Interrupt 0 */
+#define PORTA_INT1_vect_num  67
+#define PORTA_INT1_vect      _VECTOR(67)  /* External Interrupt 1 */
+
+/* ACA interrupt vectors */
+#define ACA_AC0_vect_num  68
+#define ACA_AC0_vect      _VECTOR(68)  /* AC0 Interrupt */
+#define ACA_AC1_vect_num  69
+#define ACA_AC1_vect      _VECTOR(69)  /* AC1 Interrupt */
+#define ACA_ACW_vect_num  70
+#define ACA_ACW_vect      _VECTOR(70)  /* ACW Window Mode Interrupt */
+
+/* ADCA interrupt vectors */
+#define ADCA_CH0_vect_num  71
+#define ADCA_CH0_vect      _VECTOR(71)  /* Interrupt 0 */
+#define ADCA_CH1_vect_num  72
+#define ADCA_CH1_vect      _VECTOR(72)  /* Interrupt 1 */
+#define ADCA_CH2_vect_num  73
+#define ADCA_CH2_vect      _VECTOR(73)  /* Interrupt 2 */
+#define ADCA_CH3_vect_num  74
+#define ADCA_CH3_vect      _VECTOR(74)  /* Interrupt 3 */
+
+/* TCD0 interrupt vectors */
+#define TCD0_OVF_vect_num  77
+#define TCD0_OVF_vect      _VECTOR(77)  /* Overflow Interrupt */
+
+/* TCD2 interrupt vectors */
+#define TCD2_LUNF_vect_num  77
+#define TCD2_LUNF_vect      _VECTOR(77)  /* Low Byte Underflow Interrupt */
+
+/* TCD0 interrupt vectors */
+#define TCD0_ERR_vect_num  78
+#define TCD0_ERR_vect      _VECTOR(78)  /* Error Interrupt */
+
+/* TCD2 interrupt vectors */
+#define TCD2_HUNF_vect_num  78
+#define TCD2_HUNF_vect      _VECTOR(78)  /* High Byte Underflow Interrupt */
+
+/* TCD0 interrupt vectors */
+#define TCD0_CCA_vect_num  79
+#define TCD0_CCA_vect      _VECTOR(79)  /* Compare or Capture A Interrupt */
+
+/* TCD2 interrupt vectors */
+#define TCD2_LCMPA_vect_num  79
+#define TCD2_LCMPA_vect      _VECTOR(79)  /* Low Byte Compare A Interrupt */
+
+/* TCD0 interrupt vectors */
+#define TCD0_CCB_vect_num  80
+#define TCD0_CCB_vect      _VECTOR(80)  /* Compare or Capture B Interrupt */
+
+/* TCD2 interrupt vectors */
+#define TCD2_LCMPB_vect_num  80
+#define TCD2_LCMPB_vect      _VECTOR(80)  /* Low Byte Compare B Interrupt */
+
+/* TCD0 interrupt vectors */
+#define TCD0_CCC_vect_num  81
+#define TCD0_CCC_vect      _VECTOR(81)  /* Compare or Capture C Interrupt */
+
+/* TCD2 interrupt vectors */
+#define TCD2_LCMPC_vect_num  81
+#define TCD2_LCMPC_vect      _VECTOR(81)  /* Low Byte Compare C Interrupt */
+
+/* TCD0 interrupt vectors */
+#define TCD0_CCD_vect_num  82
+#define TCD0_CCD_vect      _VECTOR(82)  /* Compare or Capture D Interrupt */
+
+/* TCD2 interrupt vectors */
+#define TCD2_LCMPD_vect_num  82
+#define TCD2_LCMPD_vect      _VECTOR(82)  /* Low Byte Compare D Interrupt */
+
+/* TCD1 interrupt vectors */
+#define TCD1_OVF_vect_num  83
+#define TCD1_OVF_vect      _VECTOR(83)  /* Overflow Interrupt */
+#define TCD1_ERR_vect_num  84
+#define TCD1_ERR_vect      _VECTOR(84)  /* Error Interrupt */
+#define TCD1_CCA_vect_num  85
+#define TCD1_CCA_vect      _VECTOR(85)  /* Compare or Capture A Interrupt */
+#define TCD1_CCB_vect_num  86
+#define TCD1_CCB_vect      _VECTOR(86)  /* Compare or Capture B Interrupt */
+
+/* SPID interrupt vectors */
+#define SPID_INT_vect_num  87
+#define SPID_INT_vect      _VECTOR(87)  /* SPI Interrupt */
+
+/* USARTD0 interrupt vectors */
+#define USARTD0_RXC_vect_num  88
+#define USARTD0_RXC_vect      _VECTOR(88)  /* Reception Complete Interrupt */
+#define USARTD0_DRE_vect_num  89
+#define USARTD0_DRE_vect      _VECTOR(89)  /* Data Register Empty Interrupt */
+#define USARTD0_TXC_vect_num  90
+#define USARTD0_TXC_vect      _VECTOR(90)  /* Transmission Complete Interrupt */
+
+/* USARTD1 interrupt vectors */
+#define USARTD1_RXC_vect_num  91
+#define USARTD1_RXC_vect      _VECTOR(91)  /* Reception Complete Interrupt */
+#define USARTD1_DRE_vect_num  92
+#define USARTD1_DRE_vect      _VECTOR(92)  /* Data Register Empty Interrupt */
+#define USARTD1_TXC_vect_num  93
+#define USARTD1_TXC_vect      _VECTOR(93)  /* Transmission Complete Interrupt */
+
+/* PORTF interrupt vectors */
+#define PORTF_INT0_vect_num  104
+#define PORTF_INT0_vect      _VECTOR(104)  /* External Interrupt 0 */
+#define PORTF_INT1_vect_num  105
+#define PORTF_INT1_vect      _VECTOR(105)  /* External Interrupt 1 */
+
+/* TCF0 interrupt vectors */
+#define TCF0_OVF_vect_num  108
+#define TCF0_OVF_vect      _VECTOR(108)  /* Overflow Interrupt */
+
+/* TCF2 interrupt vectors */
+#define TCF2_LUNF_vect_num  108
+#define TCF2_LUNF_vect      _VECTOR(108)  /* Low Byte Underflow Interrupt */
+
+/* TCF0 interrupt vectors */
+#define TCF0_ERR_vect_num  109
+#define TCF0_ERR_vect      _VECTOR(109)  /* Error Interrupt */
+
+/* TCF2 interrupt vectors */
+#define TCF2_HUNF_vect_num  109
+#define TCF2_HUNF_vect      _VECTOR(109)  /* High Byte Underflow Interrupt */
+
+/* TCF0 interrupt vectors */
+#define TCF0_CCA_vect_num  110
+#define TCF0_CCA_vect      _VECTOR(110)  /* Compare or Capture A Interrupt */
+
+/* TCF2 interrupt vectors */
+#define TCF2_LCMPA_vect_num  110
+#define TCF2_LCMPA_vect      _VECTOR(110)  /* Low Byte Compare A Interrupt */
+
+/* TCF0 interrupt vectors */
+#define TCF0_CCB_vect_num  111
+#define TCF0_CCB_vect      _VECTOR(111)  /* Compare or Capture B Interrupt */
+
+/* TCF2 interrupt vectors */
+#define TCF2_LCMPB_vect_num  111
+#define TCF2_LCMPB_vect      _VECTOR(111)  /* Low Byte Compare B Interrupt */
+
+/* TCF0 interrupt vectors */
+#define TCF0_CCC_vect_num  112
+#define TCF0_CCC_vect      _VECTOR(112)  /* Compare or Capture C Interrupt */
+
+/* TCF2 interrupt vectors */
+#define TCF2_LCMPC_vect_num  112
+#define TCF2_LCMPC_vect      _VECTOR(112)  /* Low Byte Compare C Interrupt */
+
+/* TCF0 interrupt vectors */
+#define TCF0_CCD_vect_num  113
+#define TCF0_CCD_vect      _VECTOR(113)  /* Compare or Capture D Interrupt */
+
+/* TCF2 interrupt vectors */
+#define TCF2_LCMPD_vect_num  113
+#define TCF2_LCMPD_vect      _VECTOR(113)  /* Low Byte Compare D Interrupt */
+
+/* USARTF0 interrupt vectors */
+#define USARTF0_RXC_vect_num  119
+#define USARTF0_RXC_vect      _VECTOR(119)  /* Reception Complete Interrupt */
+#define USARTF0_DRE_vect_num  120
+#define USARTF0_DRE_vect      _VECTOR(120)  /* Data Register Empty Interrupt */
+#define USARTF0_TXC_vect_num  121
+#define USARTF0_TXC_vect      _VECTOR(121)  /* Transmission Complete Interrupt */
+
+/* USB interrupt vectors */
+#define USB_BUSEVENT_vect_num  125
+#define USB_BUSEVENT_vect      _VECTOR(125)  /* SOF, suspend, resume, reset bus event interrupts, crc, underflow, overflow and stall error interrupts */
+#define USB_TRNCOMPL_vect_num  126
+#define USB_TRNCOMPL_vect      _VECTOR(126)  /* Transaction complete interrupt */
+
+#define _VECTOR_SIZE 4 /* Size of individual vector. */
+#define _VECTORS_SIZE (127 * _VECTOR_SIZE)
+
+
+/* ========== Constants ========== */
+
+#define PROGMEM_START     (0x0000)
+#define PROGMEM_SIZE      (204800)
+#define PROGMEM_END       (PROGMEM_START + PROGMEM_SIZE - 1)
+
+#define APP_SECTION_START     (0x0000)
+#define APP_SECTION_SIZE      (196608)
+#define APP_SECTION_PAGE_SIZE (512)
+#define APP_SECTION_END       (APP_SECTION_START + APP_SECTION_SIZE - 1)
+
+#define APPTABLE_SECTION_START     (0x2E000)
+#define APPTABLE_SECTION_SIZE      (8192)
+#define APPTABLE_SECTION_PAGE_SIZE (512)
+#define APPTABLE_SECTION_END       (APPTABLE_SECTION_START + APPTABLE_SECTION_SIZE - 1)
+
+#define BOOT_SECTION_START     (0x30000)
+#define BOOT_SECTION_SIZE      (8192)
+#define BOOT_SECTION_PAGE_SIZE (512)
+#define BOOT_SECTION_END       (BOOT_SECTION_START + BOOT_SECTION_SIZE - 1)
+
+#define DATAMEM_START     (0x0000)
+#define DATAMEM_SIZE      (24576)
+#define DATAMEM_END       (DATAMEM_START + DATAMEM_SIZE - 1)
+
+#define IO_START     (0x0000)
+#define IO_SIZE      (4096)
+#define IO_PAGE_SIZE (0)
+#define IO_END       (IO_START + IO_SIZE - 1)
+
+#define MAPPED_EEPROM_START     (0x1000)
+#define MAPPED_EEPROM_SIZE      (2048)
+#define MAPPED_EEPROM_PAGE_SIZE (0)
+#define MAPPED_EEPROM_END       (MAPPED_EEPROM_START + MAPPED_EEPROM_SIZE - 1)
+
+#define INTERNAL_SRAM_START     (0x2000)
+#define INTERNAL_SRAM_SIZE      (16384)
+#define INTERNAL_SRAM_PAGE_SIZE (0)
+#define INTERNAL_SRAM_END       (INTERNAL_SRAM_START + INTERNAL_SRAM_SIZE - 1)
+
+#define EEPROM_START     (0x0000)
+#define EEPROM_SIZE      (2048)
+#define EEPROM_PAGE_SIZE (32)
+#define EEPROM_END       (EEPROM_START + EEPROM_SIZE - 1)
+
+#define SIGNATURES_START     (0x0000)
+#define SIGNATURES_SIZE      (3)
+#define SIGNATURES_PAGE_SIZE (0)
+#define SIGNATURES_END       (SIGNATURES_START + SIGNATURES_SIZE - 1)
+
+#define FUSES_START     (0x0000)
+#define FUSES_SIZE      (6)
+#define FUSES_PAGE_SIZE (0)
+#define FUSES_END       (FUSES_START + FUSES_SIZE - 1)
+
+#define LOCKBITS_START     (0x0000)
+#define LOCKBITS_SIZE      (1)
+#define LOCKBITS_PAGE_SIZE (0)
+#define LOCKBITS_END       (LOCKBITS_START + LOCKBITS_SIZE - 1)
+
+#define USER_SIGNATURES_START     (0x0000)
+#define USER_SIGNATURES_SIZE      (512)
+#define USER_SIGNATURES_PAGE_SIZE (512)
+#define USER_SIGNATURES_END       (USER_SIGNATURES_START + USER_SIGNATURES_SIZE - 1)
+
+#define PROD_SIGNATURES_START     (0x0000)
+#define PROD_SIGNATURES_SIZE      (52)
+#define PROD_SIGNATURES_PAGE_SIZE (512)
+#define PROD_SIGNATURES_END       (PROD_SIGNATURES_START + PROD_SIGNATURES_SIZE - 1)
+
+#define FLASHSTART   PROGMEM_START
+#define FLASHEND     PROGMEM_END
+#define SPM_PAGESIZE 512
+#define RAMSTART     INTERNAL_SRAM_START
+#define RAMSIZE      INTERNAL_SRAM_SIZE
+#define RAMEND       INTERNAL_SRAM_END
+#define E2END        EEPROM_END
+#define E2PAGESIZE   EEPROM_PAGE_SIZE
+
+
+/* ========== Fuses ========== */
+#define FUSE_MEMORY_SIZE 6
+
+/* Fuse Byte 0 */
+#define FUSE_JTAGUSERID0  (unsigned char)~_BV(0)  /* JTAG User ID Bit 0 */
+#define FUSE_JTAGUSERID1  (unsigned char)~_BV(1)  /* JTAG User ID Bit 1 */
+#define FUSE_JTAGUSERID2  (unsigned char)~_BV(2)  /* JTAG User ID Bit 2 */
+#define FUSE_JTAGUSERID3  (unsigned char)~_BV(3)  /* JTAG User ID Bit 3 */
+#define FUSE_JTAGUSERID4  (unsigned char)~_BV(4)  /* JTAG User ID Bit 4 */
+#define FUSE_JTAGUSERID5  (unsigned char)~_BV(5)  /* JTAG User ID Bit 5 */
+#define FUSE_JTAGUSERID6  (unsigned char)~_BV(6)  /* JTAG User ID Bit 6 */
+#define FUSE_JTAGUSERID7  (unsigned char)~_BV(7)  /* JTAG User ID Bit 7 */
+#define FUSE0_DEFAULT  (0xFF)
+
+/* Fuse Byte 1 */
+#define FUSE_WDP0  (unsigned char)~_BV(0)  /* Watchdog Timeout Period Bit 0 */
+#define FUSE_WDP1  (unsigned char)~_BV(1)  /* Watchdog Timeout Period Bit 1 */
+#define FUSE_WDP2  (unsigned char)~_BV(2)  /* Watchdog Timeout Period Bit 2 */
+#define FUSE_WDP3  (unsigned char)~_BV(3)  /* Watchdog Timeout Period Bit 3 */
+#define FUSE_WDWP0  (unsigned char)~_BV(4)  /* Watchdog Window Timeout Period Bit 0 */
+#define FUSE_WDWP1  (unsigned char)~_BV(5)  /* Watchdog Window Timeout Period Bit 1 */
+#define FUSE_WDWP2  (unsigned char)~_BV(6)  /* Watchdog Window Timeout Period Bit 2 */
+#define FUSE_WDWP3  (unsigned char)~_BV(7)  /* Watchdog Window Timeout Period Bit 3 */
+#define FUSE1_DEFAULT  (0xFF)
+
+/* Fuse Byte 2 */
+#define FUSE_BODPD0  (unsigned char)~_BV(0)  /* BOD Operation in Power-Down Mode Bit 0 */
+#define FUSE_BODPD1  (unsigned char)~_BV(1)  /* BOD Operation in Power-Down Mode Bit 1 */
+#define FUSE_TOSCSEL  (unsigned char)~_BV(5)  /* Timer Oscillator pin location */
+#define FUSE_BOOTRST  (unsigned char)~_BV(6)  /* Boot Loader Section Reset Vector */
+#define FUSE2_DEFAULT  (0xFF)
+
+/* Fuse Byte 3 Reserved */
+
+/* Fuse Byte 4 */
+#define FUSE_JTAGEN  (unsigned char)~_BV(0)  /* JTAG Interface Enable */
+#define FUSE_WDLOCK  (unsigned char)~_BV(1)  /* Watchdog Timer Lock */
+#define FUSE_SUT0  (unsigned char)~_BV(2)  /* Start-up Time Bit 0 */
+#define FUSE_SUT1  (unsigned char)~_BV(3)  /* Start-up Time Bit 1 */
+#define FUSE_RSTDISBL  (unsigned char)~_BV(4)  /* External Reset Disable */
+#define FUSE4_DEFAULT  (0xFF)
+
+/* Fuse Byte 5 */
+#define FUSE_BODLVL0  (unsigned char)~_BV(0)  /* Brownout Detection Voltage Level Bit 0 */
+#define FUSE_BODLVL1  (unsigned char)~_BV(1)  /* Brownout Detection Voltage Level Bit 1 */
+#define FUSE_BODLVL2  (unsigned char)~_BV(2)  /* Brownout Detection Voltage Level Bit 2 */
+#define FUSE_EESAVE  (unsigned char)~_BV(3)  /* Preserve EEPROM Through Chip Erase */
+#define FUSE_BODACT0  (unsigned char)~_BV(4)  /* BOD Operation in Active Mode Bit 0 */
+#define FUSE_BODACT1  (unsigned char)~_BV(5)  /* BOD Operation in Active Mode Bit 1 */
+#define FUSE5_DEFAULT  (0xFF)
+
+/* ========== Lock Bits ========== */
+#define __LOCK_BITS_EXIST
+#define __BOOT_LOCK_APPLICATION_TABLE_BITS_EXIST
+#define __BOOT_LOCK_APPLICATION_BITS_EXIST
+#define __BOOT_LOCK_BOOT_BITS_EXIST
+
+/* ========== Signature ========== */
+#define SIGNATURE_0 0x1E
+#define SIGNATURE_1 0x97
+#define SIGNATURE_2 0x44
+
+/* ========== Power Reduction Condition Definitions ========== */
+
+/* PR.PRGEN */
+#define __AVR_HAVE_PRGEN       (PR_USB_bm|PR_AES_bm|PR_EBI_bm|PR_RTC_bm|PR_EVSYS_bm|PR_DMA_bm)
+#define __AVR_HAVE_PRGEN_USB
+#define __AVR_HAVE_PRGEN_AES
+#define __AVR_HAVE_PRGEN_EBI
+#define __AVR_HAVE_PRGEN_RTC
+#define __AVR_HAVE_PRGEN_EVSYS
+#define __AVR_HAVE_PRGEN_DMA
+
+/* PR.PRPA */
+#define __AVR_HAVE_PRPA        (PR_DAC_bm|PR_ADC_bm|PR_AC_bm)
+#define __AVR_HAVE_PRPA_DAC
+#define __AVR_HAVE_PRPA_ADC
+#define __AVR_HAVE_PRPA_AC
+
+/* PR.PRPB */
+#define __AVR_HAVE_PRPB        (PR_DAC_bm|PR_ADC_bm|PR_AC_bm)
+#define __AVR_HAVE_PRPB_DAC
+#define __AVR_HAVE_PRPB_ADC
+#define __AVR_HAVE_PRPB_AC
+
+/* PR.PRPC */
+#define __AVR_HAVE_PRPC        (PR_TWI_bm|PR_USART1_bm|PR_USART0_bm|PR_SPI_bm|PR_HIRES_bm|PR_TC1_bm|PR_TC0_bm)
+#define __AVR_HAVE_PRPC_TWI
+#define __AVR_HAVE_PRPC_USART1
+#define __AVR_HAVE_PRPC_USART0
+#define __AVR_HAVE_PRPC_SPI
+#define __AVR_HAVE_PRPC_HIRES
+#define __AVR_HAVE_PRPC_TC1
+#define __AVR_HAVE_PRPC_TC0
+
+/* PR.PRPD */
+#define __AVR_HAVE_PRPD        (PR_TWI_bm|PR_USART1_bm|PR_USART0_bm|PR_SPI_bm|PR_HIRES_bm|PR_TC1_bm|PR_TC0_bm)
+#define __AVR_HAVE_PRPD_TWI
+#define __AVR_HAVE_PRPD_USART1
+#define __AVR_HAVE_PRPD_USART0
+#define __AVR_HAVE_PRPD_SPI
+#define __AVR_HAVE_PRPD_HIRES
+#define __AVR_HAVE_PRPD_TC1
+#define __AVR_HAVE_PRPD_TC0
+
+/* PR.PRPE */
+#define __AVR_HAVE_PRPE        (PR_TWI_bm|PR_USART1_bm|PR_USART0_bm|PR_SPI_bm|PR_HIRES_bm|PR_TC1_bm|PR_TC0_bm)
+#define __AVR_HAVE_PRPE_TWI
+#define __AVR_HAVE_PRPE_USART1
+#define __AVR_HAVE_PRPE_USART0
+#define __AVR_HAVE_PRPE_SPI
+#define __AVR_HAVE_PRPE_HIRES
+#define __AVR_HAVE_PRPE_TC1
+#define __AVR_HAVE_PRPE_TC0
+
+/* PR.PRPF */
+#define __AVR_HAVE_PRPF        (PR_TWI_bm|PR_USART1_bm|PR_USART0_bm|PR_SPI_bm|PR_HIRES_bm|PR_TC1_bm|PR_TC0_bm)
+#define __AVR_HAVE_PRPF_TWI
+#define __AVR_HAVE_PRPF_USART1
+#define __AVR_HAVE_PRPF_USART0
+#define __AVR_HAVE_PRPF_SPI
+#define __AVR_HAVE_PRPF_HIRES
+#define __AVR_HAVE_PRPF_TC1
+#define __AVR_HAVE_PRPF_TC0
+
+
+#endif /* #ifdef _AVR_ATXMEGA192A3U_H_INCLUDED */
+
diff --git a/src/avr/test/src/avr/pgmspace.h b/src/avr/test/src/avr/pgmspace.h
new file mode 100644 (file)
index 0000000..5377eb9
--- /dev/null
@@ -0,0 +1,41 @@
+/******************************************************************************\
+
+                  This file is part of the Buildbotics firmware.
+
+                    Copyright (c) 2015 - 2018, Buildbotics LLC
+                               All rights reserved.
+
+       This file ("the software") is free software: you can redistribute it
+       and/or modify it under the terms of the GNU General Public License,
+        version 2 as published by the Free Software Foundation. You should
+        have received a copy of the GNU General Public License, version 2
+       along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+       The software 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
+                 Lesser General Public License for more details.
+
+         You should have received a copy of the GNU Lesser General Public
+                  License along with the software.  If not, see
+                         <http://www.gnu.org/licenses/>.
+
+                  For information regarding this software email:
+                    "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#pragma once
+
+#define PRPSTR "s"
+#define PROGMEM
+#define PGM_P const char *
+#define PSTR(X) X
+#define vfprintf_P vfprintf
+#define printf_P printf
+#define puts_P puts
+#define sprintf_P sprintf
+#define strcmp_P strcmp
+#define pgm_read_ptr(x) *(x)
+#define pgm_read_word(x) *(x)
+#define pgm_read_byte(x) *(x)
diff --git a/src/avr/test/src/avr/wdt.h b/src/avr/test/src/avr/wdt.h
new file mode 100644 (file)
index 0000000..bcf6f99
--- /dev/null
@@ -0,0 +1,33 @@
+/******************************************************************************\
+
+                  This file is part of the Buildbotics firmware.
+
+                    Copyright (c) 2015 - 2018, Buildbotics LLC
+                               All rights reserved.
+
+       This file ("the software") is free software: you can redistribute it
+       and/or modify it under the terms of the GNU General Public License,
+        version 2 as published by the Free Software Foundation. You should
+        have received a copy of the GNU General Public License, version 2
+       along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+       The software 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
+                 Lesser General Public License for more details.
+
+         You should have received a copy of the GNU Lesser General Public
+                  License along with the software.  If not, see
+                         <http://www.gnu.org/licenses/>.
+
+                  For information regarding this software email:
+                    "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#pragma once
+
+#define WDTO_250MS 0
+#define wdt_enable(...)
+#define wdt_disable()
+#define wdt_reset()
diff --git a/src/avr/test/src/emu.c b/src/avr/test/src/emu.c
new file mode 100644 (file)
index 0000000..8224c10
--- /dev/null
@@ -0,0 +1,151 @@
+/******************************************************************************\
+
+                  This file is part of the Buildbotics firmware.
+
+                    Copyright (c) 2015 - 2018, Buildbotics LLC
+                               All rights reserved.
+
+       This file ("the software") is free software: you can redistribute it
+       and/or modify it under the terms of the GNU General Public License,
+        version 2 as published by the Free Software Foundation. You should
+        have received a copy of the GNU General Public License, version 2
+       along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+       The software 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
+                 Lesser General Public License for more details.
+
+         You should have received a copy of the GNU Lesser General Public
+                  License along with the software.  If not, see
+                         <http://www.gnu.org/licenses/>.
+
+                  For information regarding this software email:
+                    "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#include <config.h>
+
+#include <avr/io.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdint.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/select.h>
+
+
+void __SPIC_INT_vect();      // DRV8711 SPI
+void __I2C_ISR();            // I2C from RPi
+void __ADCA_CH0_vect();      // Analog input
+void __ADCA_CH1_vect();      // Analog input
+void __RS485_DRE_vect();     // RS848
+void __RS485_TXC_vect();     // RS848
+void __RS485_RXC_vect();     // RS848
+void __SERIAL_DRE_vect();    // Serial to RPi
+void __SERIAL_RXC_vect();    // Serial from RPi
+void __STEP_LOW_LEVEL_ISR(); // Stepper lo interrupt
+void __STEP_TIMER_ISR();     // Stepper hi interrupt
+void __RTC_OVF_vect();       // RTC tick
+
+void motor_emulate_steps(int motor);
+
+
+volatile uint8_t io_mem[4096] = {0};
+
+
+int serialByte = -1;
+uint8_t i2cData[I2C_MAX_DATA];
+int i2cIndex = 0;
+bool haveI2C = false;
+fd_set readFDs;
+
+
+void cli() {}
+void sei() {}
+
+
+void emu_init() {
+  // Mark clocks ready
+  OSC.STATUS = OSC_XOSCRDY_bm | OSC_PLLRDY_bm | OSC_RC32KRDY_bm;
+
+  // So usart_flush() returns
+  SERIAL_PORT.STATUS = USART_DREIF_bm | USART_TXCIF_bm;
+
+  FD_ZERO(&readFDs);
+}
+
+
+void emu_callback() {
+  fflush(stdout);
+
+  if (RST.CTRL == RST_SWRST_bm) exit(0);
+
+  struct timeval t = {0, 0}; // 1000};
+  bool readData = true;
+  while (readData) {
+    readData = false;
+
+    // Try to read
+    FD_SET(0, &readFDs);
+    if (fcntl(3, F_GETFL) != -1) FD_SET(3, &readFDs);
+
+    if (0 < select(4, &readFDs, 0, 0, &t)) {
+      uint8_t data;
+
+      if (serialByte == -1 && FD_ISSET(0, &readFDs) && read(0, &data, 1) == 1)
+        serialByte = data;
+
+      if (!haveI2C && FD_ISSET(3, &readFDs) && read(3, &data, 1) == 1) {
+        if (data == '\n') haveI2C = true;
+        else if (i2cIndex < I2C_MAX_DATA) i2cData[i2cIndex++] = data;
+      }
+    }
+
+    // Send message to i2c port
+    if (haveI2C && (I2C_DEV.SLAVE.CTRLA & TWI_SLAVE_INTLVL_LO_gc)) {
+      // START
+      I2C_DEV.SLAVE.STATUS = TWI_SLAVE_APIF_bm | TWI_SLAVE_AP_bm;
+      __I2C_ISR();
+
+      // DATA
+      for (int i = 0; i < i2cIndex; i++) {
+        I2C_DEV.SLAVE.STATUS = TWI_SLAVE_DIF_bm;
+        I2C_DEV.SLAVE.DATA = i2cData[i];
+        __I2C_ISR();
+      }
+
+      // STOP
+      I2C_DEV.SLAVE.STATUS = TWI_SLAVE_APIF_bm;
+      __I2C_ISR();
+
+      i2cIndex = 0;
+      haveI2C = false;
+      readData = true;
+    }
+
+    // Send byte to serial port
+    if (serialByte != -1 && SERIAL_PORT.CTRLA & USART_RXCINTLVL_MED_gc) {
+      SERIAL_PORT.DATA = (uint8_t)serialByte;
+      __SERIAL_RXC_vect();
+
+      if (SERIAL_PORT.CTRLA & USART_RXCINTLVL_MED_gc) {
+        serialByte = -1;
+        readData = true;
+      }
+    }
+  }
+
+  // Call stepper ISRs
+  if (ADCB_CH0_INTCTRL == ADC_CH_INTLVL_LO_gc) __STEP_LOW_LEVEL_ISR();
+  for (int motor = 0; motor < 4; motor++) motor_emulate_steps(motor);
+  __STEP_TIMER_ISR();
+
+  // Call RTC
+  __RTC_OVF_vect();
+
+  // Throttle with remaining time
+  if (t.tv_usec) usleep(t.tv_usec);
+}
diff --git a/src/avr/test/src/util/atomic.h b/src/avr/test/src/util/atomic.h
new file mode 100644 (file)
index 0000000..86dab20
--- /dev/null
@@ -0,0 +1,31 @@
+/******************************************************************************\
+
+                  This file is part of the Buildbotics firmware.
+
+                    Copyright (c) 2015 - 2018, Buildbotics LLC
+                               All rights reserved.
+
+       This file ("the software") is free software: you can redistribute it
+       and/or modify it under the terms of the GNU General Public License,
+        version 2 as published by the Free Software Foundation. You should
+        have received a copy of the GNU General Public License, version 2
+       along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+       The software 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
+                 Lesser General Public License for more details.
+
+         You should have received a copy of the GNU Lesser General Public
+                  License along with the software.  If not, see
+                         <http://www.gnu.org/licenses/>.
+
+                  For information regarding this software email:
+                    "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#pragma once
+
+#define ATOMIC_BLOCK(x)
+#define ATOMIC_RESTORESTATE
diff --git a/src/avr/test/src/util/crc16.h b/src/avr/test/src/util/crc16.h
new file mode 100644 (file)
index 0000000..e343874
--- /dev/null
@@ -0,0 +1,30 @@
+/******************************************************************************\
+
+                  This file is part of the Buildbotics firmware.
+
+                    Copyright (c) 2015 - 2018, Buildbotics LLC
+                               All rights reserved.
+
+       This file ("the software") is free software: you can redistribute it
+       and/or modify it under the terms of the GNU General Public License,
+        version 2 as published by the Free Software Foundation. You should
+        have received a copy of the GNU General Public License, version 2
+       along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+       The software 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
+                 Lesser General Public License for more details.
+
+         You should have received a copy of the GNU Lesser General Public
+                  License along with the software.  If not, see
+                         <http://www.gnu.org/licenses/>.
+
+                  For information regarding this software email:
+                    "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#pragma once
+
+#define _crc16_update(...) 0
diff --git a/src/avr/test/src/util/delay.h b/src/avr/test/src/util/delay.h
new file mode 100644 (file)
index 0000000..e67c76a
--- /dev/null
@@ -0,0 +1,33 @@
+/******************************************************************************\
+
+                  This file is part of the Buildbotics firmware.
+
+                    Copyright (c) 2015 - 2018, Buildbotics LLC
+                               All rights reserved.
+
+       This file ("the software") is free software: you can redistribute it
+       and/or modify it under the terms of the GNU General Public License,
+        version 2 as published by the Free Software Foundation. You should
+        have received a copy of the GNU General Public License, version 2
+       along with the software. If not, see <http://www.gnu.org/licenses/>.
+
+       The software 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
+                 Lesser General Public License for more details.
+
+         You should have received a copy of the GNU Lesser General Public
+                  License along with the software.  If not, see
+                         <http://www.gnu.org/licenses/>.
+
+                  For information regarding this software email:
+                    "Joseph Coffland" <joseph@buildbotics.com>
+
+\******************************************************************************/
+
+#pragma once
+
+#include <unistd.h>
+
+#define _delay_ms(x) usleep((x) * 1000)
+#define _delay_us(x) usleep(x)
diff --git a/src/py/bbctrl/AVR.py b/src/py/bbctrl/AVR.py
new file mode 100644 (file)
index 0000000..528f00d
--- /dev/null
@@ -0,0 +1,122 @@
+################################################################################
+#                                                                              #
+#                This file is part of the Buildbotics firmware.                #
+#                                                                              #
+#                  Copyright (c) 2015 - 2018, Buildbotics LLC                  #
+#                             All rights reserved.                             #
+#                                                                              #
+#     This file ("the software") is free software: you can redistribute it     #
+#     and/or modify it under the terms of the GNU General Public License,      #
+#      version 2 as published by the Free Software Foundation. You should      #
+#      have received a copy of the GNU General Public License, version 2       #
+#     along with the software. If not, see <http://www.gnu.org/licenses/>.     #
+#                                                                              #
+#     The software 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       #
+#               Lesser General Public License for more details.                #
+#                                                                              #
+#       You should have received a copy of the GNU Lesser General Public       #
+#                License along with the software.  If not, see                 #
+#                       <http://www.gnu.org/licenses/>.                        #
+#                                                                              #
+#                For information regarding this software email:                #
+#                  "Joseph Coffland" <joseph@buildbotics.com>                  #
+#                                                                              #
+################################################################################
+
+import serial
+import logging
+import time
+import traceback
+
+import bbctrl
+import bbctrl.Cmd as Cmd
+
+log = logging.getLogger('AVR')
+
+
+class AVR(object):
+    def __init__(self, ctrl):
+        self.ctrl = ctrl
+        self.sp = None
+        self.i2c_addr = ctrl.args.avr_addr
+        self.read_cb = None
+        self.write_cb = None
+
+
+    def _start(self):
+        try:
+            self.sp = serial.Serial(self.ctrl.args.serial, self.ctrl.args.baud,
+                                    rtscts = 1, timeout = 0, write_timeout = 0)
+            self.sp.nonblocking()
+
+        except Exception as e:
+            self.sp = None
+            log.warning('Failed to open serial port: %s', e)
+
+        if self.sp is not None:
+            self.ctrl.ioloop.add_handler(self.sp, self._serial_handler,
+                                         self.ctrl.ioloop.READ)
+
+
+    def set_handlers(self, read_cb, write_cb):
+        if self.read_cb is not None or self.write_cb is not None:
+            raise Exception('AVR handler already set')
+
+        self.read_cb = read_cb
+        self.write_cb = write_cb
+        self._start()
+
+
+    def enable_write(self, enable):
+        if self.sp is None: return
+
+        flags = self.ctrl.ioloop.READ
+        if enable: flags |= self.ctrl.ioloop.WRITE
+        self.ctrl.ioloop.update_handler(self.sp, flags)
+
+
+    def _serial_write(self):
+        self.write_cb(lambda data: self.sp.write(data))
+
+
+    def _serial_read(self):
+        try:
+            data = self.sp.read(self.sp.in_waiting)
+            self.read_cb(data)
+
+        except Exception as e:
+            log.warning('%s: %s', e, data)
+
+
+    def _serial_handler(self, fd, events):
+        try:
+            if self.ctrl.ioloop.READ & events: self._serial_read()
+            if self.ctrl.ioloop.WRITE & events: self._serial_write()
+
+        except Exception as e:
+            log.warning('Serial handler error: %s', traceback.format_exc())
+
+
+    def i2c_command(self, cmd, byte = None, word = None, block = None):
+        log.info('I2C: %s b=%s w=%s d=%s' % (cmd, byte, word, block))
+        retry = 5
+        cmd = ord(cmd[0])
+
+        while True:
+            try:
+                self.ctrl.i2c.write(self.i2c_addr, cmd, byte, word, block)
+                break
+
+            except Exception as e:
+                retry -= 1
+
+                if retry:
+                    log.warning('AVR I2C failed, retrying: %s' % e)
+                    time.sleep(0.1)
+                    continue
+
+                else:
+                    log.error('AVR I2C failed: %s' % e)
+                    raise
diff --git a/src/py/bbctrl/AVREmu.py b/src/py/bbctrl/AVREmu.py
new file mode 100644 (file)
index 0000000..71f6d33
--- /dev/null
@@ -0,0 +1,178 @@
+################################################################################
+#                                                                              #
+#                This file is part of the Buildbotics firmware.                #
+#                                                                              #
+#                  Copyright (c) 2015 - 2018, Buildbotics LLC                  #
+#                             All rights reserved.                             #
+#                                                                              #
+#     This file ("the software") is free software: you can redistribute it     #
+#     and/or modify it under the terms of the GNU General Public License,      #
+#      version 2 as published by the Free Software Foundation. You should      #
+#      have received a copy of the GNU General Public License, version 2       #
+#     along with the software. If not, see <http://www.gnu.org/licenses/>.     #
+#                                                                              #
+#     The software 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       #
+#               Lesser General Public License for more details.                #
+#                                                                              #
+#       You should have received a copy of the GNU Lesser General Public       #
+#                License along with the software.  If not, see                 #
+#                       <http://www.gnu.org/licenses/>.                        #
+#                                                                              #
+#                For information regarding this software email:                #
+#                  "Joseph Coffland" <joseph@buildbotics.com>                  #
+#                                                                              #
+################################################################################
+
+import logging
+import os
+import sys
+import traceback
+
+import bbctrl
+import bbctrl.Cmd as Cmd
+
+log = logging.getLogger('AVREmu')
+
+
+class AVREmu(object):
+    def __init__(self, ctrl):
+        self.ctrl = ctrl
+        self.avrOut = None
+        self.avrIn = None
+        self.i2cOut = None
+        self.read_cb = None
+        self.write_cb = None
+        self.pid = None
+
+
+    def _start(self):
+        try:
+            if self.pid is not None: os.waitpid(self.pid, 0)
+
+            if self.avrOut is not None:
+                self.ctrl.ioloop.remove_handler(self.avrOut)
+                os.close(self.avrOut)
+
+            if self.avrIn is not None:
+                self.ctrl.ioloop.remove_handler(self.avrIn)
+                os.close(self.avrIn)
+
+            if self.i2cOut is not None: os.close(self.i2cOut)
+
+            stdinFDs = os.pipe()
+            stdoutFDs = os.pipe()
+            i2cFDs = os.pipe()
+            self.pid = os.fork()
+
+            if not self.pid: # Child
+                os.dup2(stdinFDs[0], 0)
+                os.dup2(stdoutFDs[1], 1)
+                os.dup2(i2cFDs[0], 3)
+
+                os.close(stdinFDs[0])
+                os.close(stdoutFDs[1])
+                os.close(i2cFDs[0])
+
+                os.execvp('bbemu', ('bbemu',))
+                os._exit(1) # In case of failure
+
+            # Parent
+            os.close(stdinFDs[0])
+            os.close(stdoutFDs[1])
+            os.close(i2cFDs[0])
+
+            os.set_blocking(stdinFDs[1], False)
+            os.set_blocking(stdoutFDs[0], False)
+
+            self.avrOut = stdinFDs[1]
+            self.avrIn = stdoutFDs[0]
+            self.i2cOut = i2cFDs[1]
+
+            ioloop = self.ctrl.ioloop
+            ioloop.add_handler(self.avrOut, self._avr_write_handler,
+                               ioloop.WRITE | ioloop.ERROR)
+            ioloop.add_handler(self.avrIn, self._avr_read_handler,
+                               ioloop.READ | ioloop.ERROR)
+
+            self.write_enabled = True
+
+        except Exception as e:
+            self.pid = None
+            self.avrOut, self.avrIn, self.i2cOut = None, None, None
+            log.exception('Failed to start bbemu')
+
+
+    def set_handlers(self, read_cb, write_cb):
+        if self.read_cb is not None or self.write_cb is not None:
+            raise Exception('AVR handler already set')
+
+        self.read_cb = read_cb
+        self.write_cb = write_cb
+        self._start()
+
+
+    def enable_write(self, enable):
+        if self.avrOut is None: return
+
+        flags = self.ctrl.ioloop.WRITE if enable else 0
+        self.ctrl.ioloop.update_handler(self.avrOut, flags)
+        self.write_enabled = enable
+
+
+    def _avr_write(self, data):
+        try:
+            length = os.write(self.avrOut, data)
+            self.continue_write = length and length == len(data)
+            return length
+
+        except BlockingIOError: pass
+        except BrokenPipeError: pass
+
+        return 0
+
+
+    def _avr_write_handler(self, fd, events):
+        if self.avrOut is None: return
+
+        if events & self.ctrl.ioloop.ERROR:
+            self._start()
+            return
+
+        try:
+            while True:
+                self.continue_write = False
+                self.write_cb(self._avr_write)
+                if not self.continue_write: break
+
+        except Exception as e:
+            log.warning('AVR write handler error: %s', traceback.format_exc())
+
+
+    def _avr_read_handler(self, fd, events):
+        if self.avrIn is None: return
+
+        if events & self.ctrl.ioloop.ERROR:
+            self._start()
+            return
+
+        try:
+            data = os.read(self.avrIn, 4096)
+            if data is not None: self.read_cb(data)
+
+        except Exception as e:
+            log.warning('AVR read handler error: %s %s' %
+                        (data, traceback.format_exc()))
+
+
+    def i2c_command(self, cmd, byte = None, word = None, block = None):
+        if byte is not None: data = byte
+        elif word is not None: data = word
+        elif block is not None: data = block
+        else: data = ''
+
+        try:
+            os.write(self.i2cOut, bytes(cmd + data + '\n', 'utf-8'))
+
+        except BrokenPipeError: pass
index 7dc7262fac4ddd6c5dccd0cf61e4ef4a9e7694bd..c0bfddec10f3fed69ff7dd50175aaeb9fa29871b 100755 (executable)
@@ -19,7 +19,7 @@
 #                                                                              #
 #       You should have received a copy of the GNU Lesser General Public       #
 #                License along with the software.  If not, see                 #
-#                       <http://www.gnu.org/licenses/>.                        #
+#                       <http://www.gnu.org/icenses/>.                        #
 #                                                                              #
 #                For information regarding this software email:                #
 #                  "Joseph Coffland" <joseph@buildbotics.com>                  #
@@ -60,6 +60,23 @@ def fourcc_to_string(i):
 def string_to_fourcc(s): return v4l2.v4l2_fourcc(s[0], s[1], s[2], s[3])
 
 
+def format_frame(frame):
+    frame = [
+        b'Content-type: image/jpeg\r\n',
+        b'Content-length: ', str(len(frame)).encode('utf8'), b'\r\n\r\n',
+        frame, VideoHandler.boundary.encode('utf8'), b'\n']
+
+    return b''.join(frame)
+
+
+def get_image_resource(path):
+    path = bbctrl.get_resource(path)
+
+    with open(path, 'rb') as f:
+        return format_frame(f.read())
+
+
+
 class VideoDevice(object):
     def __init__(self, path = '/dev/video0'):
         self.fd = os.open(path, os.O_RDWR | os.O_NONBLOCK | os.O_CLOEXEC)
@@ -268,8 +285,8 @@ class Camera(object):
         self.fps = ctrl.args.fps
         self.fourcc = string_to_fourcc(ctrl.args.fourcc)
 
-        self.offline_jpg = self._get_image_resource('http/images/offline.jpg')
-        self.in_use_jpg = self._get_image_resource('http/images/in-use.jpg')
+        self.offline_jpg = get_image_resource('http/images/offline.jpg')
+        self.in_use_jpg = get_image_resource('http/images/in-use.jpg')
         self.dev = None
         self.clients = []
         self.path = None
@@ -300,27 +317,11 @@ class Camera(object):
         if action == 'remove' and path == self.path: self.close()
 
 
-    def _get_image_resource(self, path):
-        path = bbctrl.get_resource(path)
-
-        with open(path, 'rb') as f:
-            return self._format_frame(f.read())
-
-
-    def _format_frame(self, frame):
-        frame = [
-            b'Content-type: image/jpeg\r\n',
-            b'Content-length: ', str(len(frame)).encode('utf8'), b'\r\n\r\n',
-            frame, VideoHandler.boundary.encode('utf8'), b'\n']
-
-        return b''.join(frame)
-
-
     def _send_frame(self, frame):
         if not len(self.clients): return
 
         try:
-            self.clients[-1].write_frame(self._format_frame(frame))
+            self.clients[-1].write_frame(format_frame(frame))
         except Exception as e:
             log.warning('Failed to write frame to client: %s' % e)
 
@@ -387,8 +388,7 @@ class Camera(object):
             self.dev.close()
 
             for client in self.clients:
-                client.write_frame(self.offline_jpg)
-                client.write_frame(self.offline_jpg)
+                client.write_frame_twice(self.offline_jpg)
 
             log.info('Closed camera %s' % self.path)
 
@@ -400,14 +400,12 @@ class Camera(object):
         log.info('Adding camera client: %d' % len(self.clients))
 
         if len(self.clients):
-            self.clients[-1].write_frame(self.in_use_jpg)
-            self.clients[-1].write_frame(self.in_use_jpg)
+            self.clients[-1].write_frame_twice(self.in_use_jpg)
 
         self.clients.append(client)
 
         if self.dev is None:
-            client.write_frame(self.offline_jpg)
-            client.write_frame(self.offline_jpg)
+            client.write_frame_twice(self.offline_jpg)
 
 
     def remove_client(self, client):
@@ -440,7 +438,11 @@ class VideoHandler(web.RequestHandler):
         self.set_header('Expires', 'Mon, 3 Jan 2000 12:34:56 GMT')
         self.set_header('Pragma', 'no-cache')
 
-        self.camera.add_client(self)
+        if self.camera is None:
+            frame = get_image_resource('http/images/offline.jpg')
+            self.write_frame_twice(frame)
+
+        else: self.camera.add_client(self)
 
 
     def write_frame(self, frame):
@@ -457,6 +459,11 @@ class VideoHandler(web.RequestHandler):
             pass # Drop frame if buffer is full
 
 
+    def write_frame_twice(self, frame):
+        self.write_frame(frame)
+        self.write_frame(frame)
+
+
     def on_connection_close(self): self.camera.remove_client(self)
 
 
index 7c53a6434dfb55b83b54442055b73e7ce0faf0cf..3408fef313f0a9981f3e3820ff6f68a2c80cc690 100644 (file)
@@ -170,7 +170,7 @@ def pause(type):
     return '%s%d' % (PAUSE, type)
 
 
-def jog(axes): return 'j' + encode_axes(axes)
+def jog(axes): return JOG + encode_axes(axes)
 
 
 def seek(switch, active, error):
index a50d07885226f6b4552e26cd151258fa7dc5ad4b..8e7f3a6a885c3ce951f9ad37eb5b8615e6f40515 100644 (file)
@@ -39,68 +39,29 @@ log = logging.getLogger('Comm')
 
 
 class Comm(object):
-    def __init__(self, ctrl):
+    def __init__(self, ctrl, avr):
         self.ctrl = ctrl
+        self.avr = avr
         self.queue = deque()
         self.in_buf = ''
         self.command = None
 
-        try:
-            self.sp = serial.Serial(ctrl.args.serial, ctrl.args.baud,
-                                    rtscts = 1, timeout = 0, write_timeout = 0)
-            self.sp.nonblocking()
-
-        except Exception as e:
-            self.sp = None
-            log.warning('Failed to open serial port: %s', e)
-
-        if self.sp is not None:
-            ctrl.ioloop.add_handler(self.sp, self._serial_handler,
-                                    ctrl.ioloop.READ)
-
-        self.i2c_addr = ctrl.args.avr_addr
+        avr.set_handlers(self._read, self._write)
 
 
     def comm_next(self): raise Exception('Not implemented')
     def comm_error(self): raise Exception('Not implemented')
 
 
-    def is_active(self):
-        return len(self.queue) or self.command is not None
+    def is_active(self): return len(self.queue) or self.command is not None
 
 
     def i2c_command(self, cmd, byte = None, word = None, block = None):
         log.info('I2C: %s b=%s w=%s d=%s' % (cmd, byte, word, block))
-        retry = 5
-        cmd = ord(cmd[0])
-
-        while True:
-            try:
-                self.ctrl.i2c.write(self.i2c_addr, cmd, byte, word, block)
-                break
-
-            except Exception as e:
-                retry -= 1
-
-                if retry:
-                    log.warning('AVR I2C failed, retrying: %s' % e)
-                    time.sleep(0.1)
-                    continue
+        self.avr.i2c_command(cmd, byte, word, block)
 
-                else:
-                    log.error('AVR I2C failed: %s' % e)
-                    raise
-
-
-    def _set_write(self, enable):
-        if self.sp is None: return
 
-        flags = self.ctrl.ioloop.READ
-        if enable: flags |= self.ctrl.ioloop.WRITE
-        self.ctrl.ioloop.update_handler(self.sp, flags)
-
-
-    def flush(self): self._set_write(True)
+    def flush(self): self.avr.enable_write(True)
 
 
     def _load_next_command(self, cmd):
@@ -116,11 +77,11 @@ class Comm(object):
         self.flush()
 
 
-    def _serial_write(self):
+    def _write(self, write):
         # Finish writing current command
         if self.command is not None:
             try:
-                count = self.sp.write(self.command)
+                count = write(self.command)
 
             except Exception as e:
                 self.command = None
@@ -137,7 +98,7 @@ class Comm(object):
         else:
             cmd = self.comm_next() # pylint: disable=assignment-from-no-return
 
-            if cmd is None: self._set_write(False) # Stop writing
+            if cmd is None: self.avr.enable_write(False) # Stop writing
             else: self._load_next_command(cmd)
 
 
@@ -175,13 +136,8 @@ class Comm(object):
             self.comm_error()
 
 
-    def _serial_read(self):
-        try:
-            data = self.sp.read(self.sp.in_waiting)
-            self.in_buf += data.decode('utf-8')
-
-        except Exception as e:
-            log.warning('%s: %s', e, data)
+    def _read(self, data):
+        self.in_buf += data.decode('utf-8')
 
         # Parse incoming serial data into lines
         while True:
@@ -214,14 +170,6 @@ class Comm(object):
                         self.flush()          # May have more data to send now
 
 
-    def _serial_handler(self, fd, events):
-        try:
-            if self.ctrl.ioloop.READ & events: self._serial_read()
-            if self.ctrl.ioloop.WRITE & events: self._serial_write()
-        except Exception as e:
-            log.warning('Serial handler error: %s', traceback.format_exc())
-
-
     def estop(self):
         if self.ctrl.state.get('xx', '') != 'ESTOPPED':
             self.i2c_command(Cmd.ESTOP)
index 69028ca7f5a85b79ede261c5b24ccb7fca3c35b2..4b447d0faa3e3f91b3fe587ba51ed20d9dc27a9b 100644 (file)
@@ -44,9 +44,12 @@ class Ctrl(object):
         self.web = bbctrl.Web(self)
 
         try:
-            self.i2c = bbctrl.I2C(args.i2c_port)
+            if args.demo: avr = bbctrl.AVREmu(self)
+            else: avr = bbctrl.AVR(self)
+
+            self.i2c = bbctrl.I2C(args.i2c_port, args.demo)
             self.lcd = bbctrl.LCD(self)
-            self.mach = bbctrl.Mach(self)
+            self.mach = bbctrl.Mach(self, avr)
             self.preplanner = bbctrl.Preplanner(self)
             self.jog = bbctrl.Jog(self)
             self.pwr = bbctrl.Pwr(self)
@@ -56,7 +59,9 @@ class Ctrl(object):
             self.lcd.add_new_page(bbctrl.MainLCDPage(self))
             self.lcd.add_new_page(bbctrl.IPLCDPage(self.lcd))
 
-            self.camera = bbctrl.Camera(self)
+            self.camera = None
+            if not args.disable_camera:
+                self.camera = bbctrl.Camera(self)
 
         except Exception as e: log.exception(e)
 
@@ -71,4 +76,5 @@ class Ctrl(object):
         self.preplanner.start()
 
 
-    def close(self): self.camera.close()
+    def close(self):
+        if not self.camera is None: self.camera.close()
index abf31d96bf680fa1e94f60e116069ed153268359..a97a528a76c140330f45e8f8161cb45f7e8659b4 100644 (file)
 #                                                                              #
 ################################################################################
 
+import errno
+
 try:
-    import smbus
+    try:
+        import smbus
+    except:
+        import smbus2 as smbus
 except:
-    import smbus2 as smbus
+    smbus = None
 
 
 class I2C(object):
-    def __init__(self, port):
+    def __init__(self, port, disabled):
         self.port = port
         self.i2c_bus = None
+        self.disabled = disabled or smbus is None
 
 
     def connect(self):
+        if self.disabled: return
         if self.i2c_bus is None:
             try:
                 self.i2c_bus = smbus.SMBus(self.port)
 
             except OSError as e:
                 self.i2c_bus = None
-                raise type(e)('I2C failed to open device: %s' % e)
+                if e.errno == errno.ENOENT: self.disabled = True
+                else: raise type(e)('I2C failed to open device: %s' % e)
 
 
     def read_word(self, addr):
         self.connect()
+        if self.disabled: return
 
         try:
             return self.i2c_bus.read_word_data(addr, 0)
@@ -61,6 +70,7 @@ class I2C(object):
 
     def write(self, addr, cmd, byte = None, word = None, block = None):
         self.connect()
+        if self.disabled: return
 
         try:
             if byte is not None:
index 15339551791ef51bd50fa6af4dfb54c1d11e25d1..6bcbd137bcde4d6bf63972f478830503757289bc 100644 (file)
@@ -74,8 +74,8 @@ def overrides(interface_class):
 
 
 class Mach(Comm):
-    def __init__(self, ctrl):
-        super().__init__(ctrl)
+    def __init__(self, ctrl, avr):
+        super().__init__(ctrl, avr)
 
         self.ctrl = ctrl
         self.planner = bbctrl.Planner(ctrl)
index b2e3866b556e73ed74a3caface49deee948808b0..b4a101f7075db947afd20606ddffc781e3828bbe 100644 (file)
@@ -172,7 +172,7 @@ class Planner():
     def _report_time(self):
         state = self.ctrl.state.get('xx', '')
 
-        if state in ['STOPPING', 'RUNNING'] and self.move_start:
+        if state in ('STOPPING', 'RUNNING') and self.move_start:
             delta = time.time() - self.move_start
             if self.move_time < delta: delta = self.move_time
             plan_time = self.current_plan_time + delta
index 1fd5dd07dc8b7ea51d64f7bd3b30132e8c2a09ab..e7f9d9343ce8707037d673ec664a3dbc71db3074 100644 (file)
@@ -148,6 +148,7 @@ class Pwr():
         try:
             for i in range(len(self.regs)):
                 value = self.ctrl.i2c.read_word(self.i2c_addr + i)
+                if value is None: return # Handle lack of i2c port
 
                 if i == TEMP_REG: value -= 273
                 elif i == FLAGS_REG or i == VERSION_REG: pass
index 9486017c800812e64a8fb80c0b57989c4f1ffcca..4eb9d611ee7e72221777b20f9023785504aef580 100644 (file)
@@ -58,6 +58,8 @@ from bbctrl.CommandQueue import CommandQueue
 from bbctrl.MainLCDPage import MainLCDPage
 from bbctrl.IPLCDPage import IPLCDPage
 from bbctrl.Camera import Camera, VideoHandler
+from bbctrl.AVR import AVR
+from bbctrl.AVREmu import AVREmu
 import bbctrl.Cmd as Cmd
 import bbctrl.v4l2 as v4l2
 
@@ -110,6 +112,8 @@ def parse_args():
                         help = 'Verbose output')
     parser.add_argument('-l', '--log', metavar = "FILE",
                         help = 'Set a log file')
+    parser.add_argument('--disable-camera', action = 'store_true',
+                        help = 'Disable the camera')
     parser.add_argument('--width', default = 640, type = int,
                         help = 'Camera width')
     parser.add_argument('--height', default = 480, type = int,
@@ -118,6 +122,8 @@ def parse_args():
                         help = 'Camera frames per second')
     parser.add_argument('--fourcc', default = 'MJPG',
                         help = 'Camera frame format')
+    parser.add_argument('--demo', action = 'store_true',
+                        help = 'Enter demo mode')
 
     return parser.parse_args()
 
@@ -168,4 +174,4 @@ def run():
     except: logging.getLogger().exception('')
 
 
-if __name__ == "__main__": run()
+if __name__ == '__main__': run()
index 1a4ea561563127a06ba414bc1a885b3d931a6228..6fd5abff68262bdfeb677c181a11dd9ee8ed6507 100644 (file)
@@ -332,7 +332,7 @@ span.unit
 
   .info
     empty-cells show
-    width 32.95%
+    width 32.9%
     display inline-block
 
     th, td