diff --git a/LICENSE.txt b/LICENSE.txt
new file mode 100644
index 0000000000000000000000000000000000000000..d645695673349e3947e8e5ae42332d0ac3164cd7
--- /dev/null
+++ b/LICENSE.txt
@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/src/Makefile b/src/Makefile
index ec305f6194be716d641df556e253a5f559a7b4af..029d548b17584d8f9ec30ee325d11bb10b6d0a6f 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -1,11 +1,16 @@
-# Copyright (C) 2017 ETH Zurich, University of Bologna
-# All rights reserved.
+# Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 #
-# This code is under development and not yet released to the public. Until it
-# is released, the code is under the copyright of ETH Zurich and the University
-# of Bologna, and may contain confidential and/or unpublished work. Any
-# reuse/redistribution is strictly forbidden without written permission from
-# ETH Zurich.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 #
 # Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
diff --git a/src/backend.hpp b/src/backend.hpp
index 5ad17f08ab60464019aebffa23a8bd91907d5946..16e20acd677af9042ede78591d94ef0fdfcbf9bf 100644
--- a/src/backend.hpp
+++ b/src/backend.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include "tensor.hpp"
diff --git a/src/backend/distributed.cpp b/src/backend/distributed.cpp
index 692b213a9371abd2ac1abc992999d5132e1fcd6f..cceb47fabcb6fbfdbb5320279c4083fe36f35dad 100644
--- a/src/backend/distributed.cpp
+++ b/src/backend/distributed.cpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #include "../utils.hpp"
 #include "distributed.hpp"
diff --git a/src/backend/distributed.hpp b/src/backend/distributed.hpp
index 0bf9c089daf29907aaec49b893678dd44d329f46..d9f1f4bc68b4925bda7e9bcf93f3bcc34aea4bde 100644
--- a/src/backend/distributed.hpp
+++ b/src/backend/distributed.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include "../backend.hpp"
diff --git a/src/backend/simple.cpp b/src/backend/simple.cpp
index 657051439f160ab9f653403b500c1ca61b4b1f49..b5188172a106ed8f4632dbcb75124f8d068f7345 100644
--- a/src/backend/simple.cpp
+++ b/src/backend/simple.cpp
@@ -1,11 +1,16 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
 // Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
diff --git a/src/backend/simple.hpp b/src/backend/simple.hpp
index 94f4bfbbc3d1b227e74d796be73b3f0ef30ad9d4..9dd258dd34d9ee0a15de8bd0a6b780409447dd71 100644
--- a/src/backend/simple.hpp
+++ b/src/backend/simple.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include "../backend.hpp"
diff --git a/src/backend/tiled.cpp b/src/backend/tiled.cpp
index cfb947b44eaac038e7ca601625333d694d353b66..be955d1d19c3cc1fb4f42803b3e6b01d2786489a 100644
--- a/src/backend/tiled.cpp
+++ b/src/backend/tiled.cpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #include "../utils.hpp"
 #include "tiled.hpp"
diff --git a/src/backend/tiled.hpp b/src/backend/tiled.hpp
index 8459b0199c8e447d88cb1643bae21465ea00dc2e..e856133d659b75594ec270736124731107f61f3f 100644
--- a/src/backend/tiled.hpp
+++ b/src/backend/tiled.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include "../backend.hpp"
diff --git a/src/cifar10.cpp b/src/cifar10.cpp
index d8208db38c92168878fbda5be7f6b51ddadee220..479947e721e3dd274727412dec0005650a457378 100644
--- a/src/cifar10.cpp
+++ b/src/cifar10.cpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 
 #include "tensor.hpp"
diff --git a/src/core.hpp b/src/core.hpp
index 87fdbba309331d4790cda48c3643ddbf024fe0ea..e0e6843fa80246b49f5aab1f02ad98ab47e92bbb 100644
--- a/src/core.hpp
+++ b/src/core.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include <algorithm>
diff --git a/src/kernels/conv_relu_fwd.cpp b/src/kernels/conv_relu_fwd.cpp
index 93ac3b7204bfc93b6eb813e0c34325948373a61a..f6b1a240738a00bd3a6c8a2f1f885244479298c0 100644
--- a/src/kernels/conv_relu_fwd.cpp
+++ b/src/kernels/conv_relu_fwd.cpp
@@ -1,11 +1,16 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
-//
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
 // Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
diff --git a/src/kernels/conv_relu_fwd.hpp b/src/kernels/conv_relu_fwd.hpp
index 63c3869db7d2c1f66f7b07acc9bedfd9d125aeea..fbaa3ada14cb5194d77dc7fbbdeef81dc5e852ff 100644
--- a/src/kernels/conv_relu_fwd.hpp
+++ b/src/kernels/conv_relu_fwd.hpp
@@ -1,11 +1,16 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
 // Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
diff --git a/src/kernels/kernels.hpp b/src/kernels/kernels.hpp
index e0de64e97ec204fff86bdd07cc471da6dd14150f..77f821c4e64ec7358cbfe605ff8fef46647e7960 100644
--- a/src/kernels/kernels.hpp
+++ b/src/kernels/kernels.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include "tensor.hpp"
diff --git a/src/mmap.cpp b/src/mmap.cpp
index 30d8c686a7df67d1f7689212ca1d18eda9c4a020..c65b5b26dafb7de8798c6f54e82340c4e71281ca 100644
--- a/src/mmap.cpp
+++ b/src/mmap.cpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #include "mmap.hpp"
 #include <fcntl.h>
diff --git a/src/mmap.hpp b/src/mmap.hpp
index b1b3b7b5ad9968ca45b86f5c8f3a8fff7540b58f..7fb7f5948785f747c1a637dad04213d4710f0657 100644
--- a/src/mmap.hpp
+++ b/src/mmap.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include <cstddef>
diff --git a/src/nst.cpp b/src/nst.cpp
index afe27d0fda93d14536ad339f93b27a54de1cda86..17bd837903dbd91960b6519b496e2929d58ada0c 100644
--- a/src/nst.cpp
+++ b/src/nst.cpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #include "nst.hpp"
 
diff --git a/src/nst.hpp b/src/nst.hpp
index 92df7fd3292800592d98ee8f15d3a52aaf61e77b..0b920f0e0125ac018b5195aad45588c3b40da4c0 100644
--- a/src/nst.hpp
+++ b/src/nst.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #include "tensor.hpp"
 #include <thread>
diff --git a/src/nst_model/fp32_mac.cpp b/src/nst_model/fp32_mac.cpp
index 639429451fa8b6e53b2f4fb474f0ea6d1fc44865..c1212c177ba58251aba1ffcffa2a0efa6baba7ab 100644
--- a/src/nst_model/fp32_mac.cpp
+++ b/src/nst_model/fp32_mac.cpp
@@ -1,24 +1,19 @@
-///////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public.
-// Until it is released, the code is under the copyright of ETH Zurich and
-// the University of Bologna, and may contain confidential and/or unpublished
-// work. Any reuse/redistribution is strictly forbidden without written
-// permission from ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
 //
-// Bug fixes and contributions will eventually be released under the
-// SolderPad open hardware license in the context of the PULP platform
-// (http://www.pulp-platform.org), under the copyright of ETH Zurich and the
-// University of Bologna.
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-///////////////////////////////////////////////////////////////////////////////
-// Description:  This file is part of the NST Golden model, and implements
-// a bit true model of the FP Mac unit.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
-// Author: Michael Schaffner (schaffner@iis.ee.ethz.ch)
-///////////////////////////////////////////////////////////////////////////////
+// Michael Schaffner <schaffner@iis.ee.ethz.ch>
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 
 #include <stdio.h>
diff --git a/src/nst_model/fp32_mac.hpp b/src/nst_model/fp32_mac.hpp
index a1a0a104c667fa11343a32ac0c9ca0a2cbaf6c60..dce20b24ec2137f06f10daa8ca92fb2154b07687 100644
--- a/src/nst_model/fp32_mac.hpp
+++ b/src/nst_model/fp32_mac.hpp
@@ -1,24 +1,19 @@
-///////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public.
-// Until it is released, the code is under the copyright of ETH Zurich and
-// the University of Bologna, and may contain confidential and/or unpublished
-// work. Any reuse/redistribution is strictly forbidden without written
-// permission from ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
 //
-// Bug fixes and contributions will eventually be released under the
-// SolderPad open hardware license in the context of the PULP platform
-// (http://www.pulp-platform.org), under the copyright of ETH Zurich and the
-// University of Bologna.
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-///////////////////////////////////////////////////////////////////////////////
-// Description:  This file is part of the NST Golden model, and implements
-// a bit true model of the FP Mac unit.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
-// Author: Michael Schaffner (schaffner@iis.ee.ethz.ch)
-///////////////////////////////////////////////////////////////////////////////
+// Michael Schaffner <schaffner@iis.ee.ethz.ch>
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 
diff --git a/src/nst_model/nstV2Api.cpp b/src/nst_model/nstV2Api.cpp
index d26489241e6b05769e58a6f5ac7568f9a114ca95..498efe1398d18842a426f53c3a7c0ca0755ea34a 100644
--- a/src/nst_model/nstV2Api.cpp
+++ b/src/nst_model/nstV2Api.cpp
@@ -1,23 +1,19 @@
-///////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public.
-// Until it is released, the code is under the copyright of ETH Zurich and
-// the University of Bologna, and may contain confidential and/or unpublished
-// work. Any reuse/redistribution is strictly forbidden without written
-// permission from ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
 //
-// Bug fixes and contributions will eventually be released under the
-// SolderPad open hardware license in the context of the PULP platform
-// (http://www.pulp-platform.org), under the copyright of ETH Zurich and the
-// University of Bologna.
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-///////////////////////////////////////////////////////////////////////////////
-// Description:  includes the implementation of the NST emulation functions
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
-// Author: Michael Schaffner (schaffner@iis.ee.ethz.ch)
-///////////////////////////////////////////////////////////////////////////////
+// Michael Schaffner <schaffner@iis.ee.ethz.ch>
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 
 #include <stdio.h>
@@ -217,7 +213,7 @@ nstV2Api::nstFuncModel ()
             op = new nstMaskMacOp(this);
             break;
         case C_NST_COPY_OP:
-            op = new nstCopyOp(this);    
+            op = new nstCopyOp(this);
             break;
         default:
             assert(0);
@@ -828,7 +824,7 @@ nstMaskMacOp::execute() {
         printf("fetching: opB = %f (0x%08X)\n",fp32ToFloat(*opB), *opB);
 #endif
     }
-    
+
     switch(nst->auxFunc) {
         case C_NST_THTST_AUX_CMP_EQ:
             tst = (fp32ToFloat(nst->aluState) == fp32ToFloat(*opB));
@@ -912,11 +908,11 @@ nstCopyOp::init() {
             nst->aluState = *(uint32_t *)nst->agu[nst->initSel];
         }
     }
-    
+
 #if NST_DEBUG_LEVEL > 1
     printf("init alu with %f (0x%08X)\n",fp32ToFloat(nst->aluState), nst->aluState);
     printf("op: NST_COPY");
-#endif    
+#endif
 
 }
 
@@ -925,7 +921,7 @@ nstCopyOp::execute() {
 
     if(nst->auxFunc & 0x1) {
         nst->aluState = *(uint32_t *)nst->agu[0];
-    
+
 #if NST_DEBUG_LEVEL > 1
         printf("fetching: aluState = %f (0x%08X)\n",fp32ToFloat(nst->aluState), nst->aluState);
 #endif
diff --git a/src/nst_model/nstV2Api.hpp b/src/nst_model/nstV2Api.hpp
index 6ce29acee310135e3c69bdf90440bdb9d69bc077..fd53c8df48b25a66b4678d01ac95ed87c677b95c 100644
--- a/src/nst_model/nstV2Api.hpp
+++ b/src/nst_model/nstV2Api.hpp
@@ -1,11 +1,16 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
 // Michael Schaffner <schaffner@iis.ee.ethz.ch>
 // Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
@@ -198,7 +203,7 @@ public:
     inline void
     setNstAddr(uint32_t nstAddr_) {
         nstAddr = (void*)(size_t)nstAddr_;
-    }  
+    }
 
 // functions for NST/CORE interaction on PULP
 #ifndef NST_EMULATION_ON
diff --git a/src/param.hpp b/src/param.hpp
index d80f140b630610192cdc462e9d91d9a5b8c0cd88..89dc99099c4bf8a8fc82302728a05ced8e89777d 100644
--- a/src/param.hpp
+++ b/src/param.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include "mmap.hpp"
diff --git a/src/tensor-dma.hpp b/src/tensor-dma.hpp
index d4b4959bf3871ff5c8f672c799f7e53678e9d7a4..5c7bf1be925db4429303cea22410a7a99cd481f0 100644
--- a/src/tensor-dma.hpp
+++ b/src/tensor-dma.hpp
@@ -1,11 +1,16 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
 // Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
diff --git a/src/tensor-io.hpp b/src/tensor-io.hpp
index d17932e584a47caf8f33759457b35480046204ee..9e5592cd4af4ff7eb90175ef848c8de967e9f64f 100644
--- a/src/tensor-io.hpp
+++ b/src/tensor-io.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include "tensor.hpp"
diff --git a/src/tensor-padding.hpp b/src/tensor-padding.hpp
index 08a96b5a9ebc67911bac032c065b4d4fede8a77d..34cfc485740a4debee51863f0def0451c6aa9389 100644
--- a/src/tensor-padding.hpp
+++ b/src/tensor-padding.hpp
@@ -1,11 +1,16 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
 // Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
diff --git a/src/tensor.hpp b/src/tensor.hpp
index 942374cf5204d75013c2de9c4288b0263fc4401d..5949258c046a4ffc2d824f21e7935a6b61e82ad1 100644
--- a/src/tensor.hpp
+++ b/src/tensor.hpp
@@ -1,11 +1,16 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
 // Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
diff --git a/src/utils.hpp b/src/utils.hpp
index a0834643c82d6f86405808652b08e293ded620f7..045c07c55d5bc62a904933dc7d0b68fcffc6a940 100644
--- a/src/utils.hpp
+++ b/src/utils.hpp
@@ -1,13 +1,18 @@
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-// This code is under development and not yet released to the public. Until it
-// is released, the code is under the copyright of ETH Zurich and the University
-// of Bologna, and may contain confidential and/or unpublished work. Any
-// reuse/redistribution is strictly forbidden without written permission from
-// ETH Zurich.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #pragma once
 #include "core.hpp"
diff --git a/testbench/Makefile b/testbench/Makefile
index 9f5a247594124b530ae971a63bc170689bc7e793..1fb1b8af4b76df5e5682d7830e89c3ea25392871 100644
--- a/testbench/Makefile
+++ b/testbench/Makefile
@@ -1,11 +1,16 @@
-# Copyright (C) 2017 ETH Zurich, University of Bologna
-# All rights reserved.
+# Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 #
-# This code is under development and not yet released to the public. Until it
-# is released, the code is under the copyright of ETH Zurich and the University
-# of Bologna, and may contain confidential and/or unpublished work. Any
-# reuse/redistribution is strictly forbidden without written permission from
-# ETH Zurich.
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
 #
 # Michael Schaffner <schaffner@iis.ee.ethz.ch>
 # Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
diff --git a/testbench/genTestData.cpp b/testbench/genTestData.cpp
index b5b2e6b7529edeffa90791513ad03401f8909577..aa2f385b7483ed6a20f2cd2ee68b912bf5cd22bc 100644
--- a/testbench/genTestData.cpp
+++ b/testbench/genTestData.cpp
@@ -1,23 +1,19 @@
-///////////////////////////////////////////////////////////////////////////////
-// Copyright (C) 2017 ETH Zurich, University of Bologna
-// All rights reserved.
+// Copyright (C) 2017-2019 ETH Zurich, University of Bologna
 //
-// This code is under development and not yet released to the public.
-// Until it is released, the code is under the copyright of ETH Zurich and
-// the University of Bologna, and may contain confidential and/or unpublished 
-// work. Any reuse/redistribution is strictly forbidden without written
-// permission from ETH Zurich.
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
 //
-// Bug fixes and contributions will eventually be released under the
-// SolderPad open hardware license in the context of the PULP platform
-// (http://www.pulp-platform.org), under the copyright of ETH Zurich and the
-// University of Bologna.
+//     http://www.apache.org/licenses/LICENSE-2.0
 //
-///////////////////////////////////////////////////////////////////////////////
-// Description: 
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
 //
-// Author: Michael Schaffner (schaffner@iis.ee.ethz.ch)
-///////////////////////////////////////////////////////////////////////////////
+// Michael Schaffner <schaffner@iis.ee.ethz.ch>
+// Fabian Schuiki <fschuiki@iis.ee.ethz.ch>
 
 #include <stdio.h>
 #include <stdlib.h>
@@ -26,7 +22,7 @@
 #include <math.h>
 #include <random>
 
-#define NST_EMULATION_ON 
+#define NST_EMULATION_ON
 
 #include "nstV2Api.hpp"
 
@@ -52,16 +48,16 @@
 #define ENABLE_COPY_TEST1
 
 /////////////////////////////
-// 
+//
 /////////////////////////////
 
-void 
-writeMemDump(const char *     fileName, 
+void
+writeMemDump(const char *     fileName,
              const uint32_t * array) {
     FILE * fid = fopen(fileName,"w");
     if(fid == NULL) {
          throw("error opening file\n");
-    } 
+    }
     for(uint32_t k = 0; k< C_TCDM_MEMSIZE; k++) {
         fprintf(fid,"0x%08x 0x%08x\n", k<<2, array[k]);
     }
@@ -71,9 +67,9 @@ writeMemDump(const char *     fileName,
 
 int
 main(int argc, char ** argv) {
-    
+
     try {
-        
+
         // 2D/2D convolution example
         uint32_t * tcdm = new uint32_t[C_TCDM_MEMSIZE];
 
@@ -91,27 +87,27 @@ main(int argc, char ** argv) {
         uint32_t cnt;
         char * str1 = new char[300];
         char * str2 = new char[300];
-        
+
         cnt = 0;
-            
+
         //////////////////////////////////////////////////////////
         // fixed vector length tests
         //////////////////////////////////////////////////////////
 
         /////////////////////////////
         // 1D MAC reduction kernel
-        // variants 
+        // variants
         // with/without init,
         // with/without ReLu
         // addititive/subtractive accumulation
         /////////////////////////////
 
-#ifdef ENABLE_1D_MAC_TEST        
+#ifdef ENABLE_1D_MAC_TEST
 
         for(int k = 0; k < 8; k++) {
 
-            vectorLen1 = 100; 
-            
+            vectorLen1 = 100;
+
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
 
             opA = tcdm + vectorLen1;
@@ -120,24 +116,24 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opA+n) = floatTofp32(dist(re));        
-                *(opB+n) = floatTofp32(dist(re));        
+                *(opA+n) = floatTofp32(dist(re));
+                *(opB+n) = floatTofp32(dist(re));
             }
 
-            *(res+0) = floatTofp32(dist(re));  
+            *(res+0) = floatTofp32(dist(re));
 
             // dump memroy initialization
             sprintf(str1,"../stimuli/ini%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             nst.stageLoopNest(1,1,1,
                               {vectorLen1,0U,0U,0U,0U},
                               {1,0,0,0,0,
                                1,0,0,0,0,
                                0,0,0,0,0});
 
-            nst.stageAguOffs(opA, 
-                             opB, 
+            nst.stageAguOffs(opA,
+                             opB,
                              res);
 
             nst.stageCmd(C_NST_MAC_OP,                     // opCode
@@ -146,37 +142,37 @@ main(int argc, char ** argv) {
                          C_NST_SET_CMD_IRQ,                // irqCfg
                          (0x1 & (k >> 2)));                // polarity
 
-            // dump nst job 
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"1D_reduction_NST_MAC_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
 
             // call golden model
             nst.issueCmd();
-            
+
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
+            cnt++;
         }
 #endif
 
         /////////////////////////////
         // 2D reduction kernels
-        // variants 
+        // variants
         // with/without init,
         // with/without ReLu
         // addititive/subtractive accumulation
         /////////////////////////////
 
-#ifdef ENABLE_2D_MAC_TEST        
+#ifdef ENABLE_2D_MAC_TEST
 
         for(int k = 0; k < 8; k++) {
 
-            vectorLen1 = 10; 
-            
+            vectorLen1 = 10;
+
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
 
             opA = tcdm + 10;
@@ -185,11 +181,11 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1*vectorLen1; ++n) {
-                *(opA+n) = floatTofp32(dist(re));        
-                *(opB+n) = floatTofp32(dist(re));        
+                *(opA+n) = floatTofp32(dist(re));
+                *(opB+n) = floatTofp32(dist(re));
             }
 
-            *(res+0) = floatTofp32(dist(re));  
+            *(res+0) = floatTofp32(dist(re));
 
             // dump memroy initialization
             sprintf(str1,"../stimuli/ini%d.txt", cnt);
@@ -208,8 +204,8 @@ main(int argc, char ** argv) {
                          (0x1 & (k >> 1)),                 // auxFunc
                          C_NST_SET_CMD_IRQ,                // irqCfg
                          (0x1 & (k >> 2)));                // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"2D_reduction_NST_MAC_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -220,27 +216,27 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
+            cnt++;
         }
 #endif
 
         /////////////////////////////
         // 3D reduction kernels with 2D strides (uses all loops)
-        // variants 
+        // variants
         // with/without init,
         // with/without ReLu
         // addititive/subtractive accumulation
         /////////////////////////////
 
-#ifdef ENABLE_3D_MAC_TEST  
+#ifdef ENABLE_3D_MAC_TEST
         for(int k = 0; k < 8; k++) {
 
             // generate two 20x20 tiles with 10 channels
-            vectorLen1 = 10*20*20; 
+            vectorLen1 = 10*20*20;
             // a 3D convolution with 2D stride will then generate a 10x10 output
-            
+
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
 
             opA = tcdm + vectorLen1;
@@ -249,11 +245,11 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opA+n) = floatTofp32(dist(re));        
-                *(opB+n) = floatTofp32(dist(re));        
+                *(opA+n) = floatTofp32(dist(re));
+                *(opB+n) = floatTofp32(dist(re));
             }
 
-            *(res+0) = floatTofp32(dist(re));  
+            *(res+0) = floatTofp32(dist(re));
 
             // dump memroy initialization
             sprintf(str1,"../stimuli/ini%d.txt", cnt);
@@ -272,8 +268,8 @@ main(int argc, char ** argv) {
                          (0x1 & (k >> 1)),                 // auxFunc
                          C_NST_SET_CMD_IRQ,                // irqCfg
                          (0x1 & (k >> 2)));                // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"3D_reduction_2D_stride_NST_MAC_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -284,9 +280,9 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
+            cnt++;
         }
 #endif
 
@@ -297,12 +293,12 @@ main(int argc, char ** argv) {
         // addition/subtraction
         /////////////////////////////
 
-#ifdef ENABLE_VADDSUB_TEST        
+#ifdef ENABLE_VADDSUB_TEST
 
         for(int k = 0; k < 4; k++) {
 
-            vectorLen1 = 100; 
-            
+            vectorLen1 = 100;
+
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
 
             opA = tcdm + vectorLen1;
@@ -311,11 +307,11 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opA+n) = floatTofp32(dist(re));        
-                *(opB+n) = floatTofp32(dist(re));        
+                *(opA+n) = floatTofp32(dist(re));
+                *(opB+n) = floatTofp32(dist(re));
             }
 
-            *(res+0) = floatTofp32(dist(re));  
+            *(res+0) = floatTofp32(dist(re));
 
             // dump memroy initialization
             sprintf(str1,"../stimuli/ini%d.txt", cnt);
@@ -326,7 +322,7 @@ main(int argc, char ** argv) {
                                {1,0,0,0,0,
                                 1,0,0,0,0,
                                 1,0,0,0,0});
-            
+
             nst.stageAguOffs(opA, opB, res);
 
             nst.stageCmd(C_NST_VADDSUB_OP,      // opCode
@@ -334,8 +330,8 @@ main(int argc, char ** argv) {
                          (0x1 & k),             // auxFunc
                          C_NST_SET_CMD_IRQ,     // irqCfg
                          (0x1 & (k >> 1)));     // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"1D_vector_C_NST_VADDSUB_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -346,9 +342,9 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
+            cnt++;
         }
 #endif
 
@@ -358,12 +354,12 @@ main(int argc, char ** argv) {
         // addition/subtraction
         /////////////////////////////
 
-#ifdef ENABLE_VMULT_TEST        
+#ifdef ENABLE_VMULT_TEST
 
         for(int k = 0; k < 4; k++) {
 
-            vectorLen1 = 100; 
-            
+            vectorLen1 = 100;
+
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
 
             opA = tcdm + vectorLen1;
@@ -372,11 +368,11 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opA+n) = floatTofp32(dist(re));        
-                *(opB+n) = floatTofp32(dist(re));        
+                *(opA+n) = floatTofp32(dist(re));
+                *(opB+n) = floatTofp32(dist(re));
             }
 
-            *(res+0) = floatTofp32(dist(re));  
+            *(res+0) = floatTofp32(dist(re));
 
             // dump memroy initialization
             sprintf(str1,"../stimuli/ini%d.txt", cnt);
@@ -395,8 +391,8 @@ main(int argc, char ** argv) {
                          (0x1 & k),  // auxFunc
                          C_NST_SET_CMD_IRQ, // irqCfg
                          (0x1 & (k >> 1))); // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"1D_vector_C_NST_VMULT_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -407,23 +403,23 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
-        }        
+            cnt++;
+        }
 #endif
 
         /////////////////////////////
         // outer product
         /////////////////////////////
 
-#ifdef ENABLE_OUTERP_TEST        
+#ifdef ENABLE_OUTERP_TEST
 
         for(int k = 0; k < 4; k++) {
 
             // 20x20 outerproduct
-            vectorLen1 = 20; 
-            
+            vectorLen1 = 20;
+
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
 
             opA = tcdm +   vectorLen1*vectorLen1+10;
@@ -432,8 +428,8 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opA+n) = floatTofp32(dist(re));    
-                *(opB+n) = floatTofp32(dist(re));    
+                *(opA+n) = floatTofp32(dist(re));
+                *(opB+n) = floatTofp32(dist(re));
             }
 
             // dump memroy initialization
@@ -453,8 +449,8 @@ main(int argc, char ** argv) {
                          (0x1 & (k>>1)),       // auxFunc
                          C_NST_SET_CMD_IRQ,    // irqCfg
                          (0x1 & k));           // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"outer_product_C_NST_OUTERP_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -465,25 +461,25 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
-        }    
+            cnt++;
+        }
 #endif
 
         /////////////////////////////
         // 1D MAXMIN reduction kernel
-        // variants 
+        // variants
         // with/without init,
         // with/without ReLu
         // addititive/subtractive accumulation
         /////////////////////////////
 
-#ifdef ENABLE_MAXMIN_TEST              
+#ifdef ENABLE_MAXMIN_TEST
         for(int k = 0; k < 4; k++) {
 
-            vectorLen1 = 100; 
-            
+            vectorLen1 = 100;
+
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
 
             opA = tcdm + vectorLen1;
@@ -492,11 +488,11 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opA+n) = floatTofp32(dist(re));        
-                *(opB+n) = floatTofp32(dist(re));        
+                *(opA+n) = floatTofp32(dist(re));
+                *(opB+n) = floatTofp32(dist(re));
             }
 
-            *(res+0) = floatTofp32(dist(re));  
+            *(res+0) = floatTofp32(dist(re));
 
             // dump memroy initialization
             sprintf(str1,"../stimuli/ini%d.txt", cnt);
@@ -515,8 +511,8 @@ main(int argc, char ** argv) {
                          (0x1 & k),         // auxFunc
                          C_NST_SET_CMD_IRQ, // irqCfg
                          (0x1 & (k >> 1))); // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"1D_reduction_NST_MAXMIN_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -527,23 +523,23 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
+            cnt++;
         }
 #endif
 
         /////////////////////////////
-        // test/thresholding 
-        // variants 
+        // test/thresholding
+        // variants
         /////////////////////////////
 
-#ifdef ENABLE_THTST_TEST  
+#ifdef ENABLE_THTST_TEST
 
         for(int k = 0; k < 32; k++) {
 
             // loop over 10 vectors of length 100
-            vectorLen1 = 100*10; 
+            vectorLen1 = 100*10;
             // produces 10*100 output values
 
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
@@ -554,18 +550,18 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opB+n) = floatTofp32(dist(re));        
+                *(opB+n) = floatTofp32(dist(re));
             }
-            
+
             for (uint32_t n = 0; n < 10; ++n) {
-                *(opA+n) = floatTofp32(dist(re));        
+                *(opA+n) = floatTofp32(dist(re));
             }
 
             // for equality tests
-            *(opB+2) = floatTofp32(0.0); 
-            *(opA+1) = *(opB+15); 
+            *(opB+2) = floatTofp32(0.0);
+            *(opA+1) = *(opB+15);
 
-            *(res+0) = floatTofp32(dist(re));  
+            *(res+0) = floatTofp32(dist(re));
 
             // dump memroy initialization
             sprintf(str1,"../stimuli/ini%d.txt", cnt);
@@ -584,8 +580,8 @@ main(int argc, char ** argv) {
                          (0x7 & (k >> 1)),  // auxFunc
                          C_NST_SET_CMD_IRQ, // irqCfg
                          (0x1 & (k >> 4))); // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"vector_mask_NST_THTST_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -596,22 +592,22 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
+            cnt++;
         }
 #endif
 
         /////////////////////////////
         // masking
-        // variants 
+        // variants
         /////////////////////////////
 
-#ifdef ENABLE_MASK0_TEST  
+#ifdef ENABLE_MASK0_TEST
         for(int k = 0; k < 8; k++) {
 
             // loop over 10 vectors of length 100
-            vectorLen1 = 100*10; 
+            vectorLen1 = 100*10;
             // produces 10*100 output values
 
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
@@ -622,8 +618,8 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opB+n) = floatTofp32(dist(re));        
-                *(opA+n) = floatTofp32(dist(re));        
+                *(opB+n) = floatTofp32(dist(re));
+                *(opA+n) = floatTofp32(dist(re));
             }
 
             // dump memroy initialization
@@ -643,8 +639,8 @@ main(int argc, char ** argv) {
                          (0x3 & k),            // auxFunc
                          C_NST_SET_CMD_IRQ,    // irqCfg
                          (0x1 & (k >> 2)));    // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"vector_mask_NST_MASKMAC_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -655,23 +651,23 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
+            cnt++;
         }
 #endif
 
         /////////////////////////////
         // masking
-        // variants 
+        // variants
         // with internal counters
         /////////////////////////////
 
-#ifdef ENABLE_MASK1_TEST  
+#ifdef ENABLE_MASK1_TEST
         for(int k = 0; k < 2; k++) {
 
             // loop over 10 vectors of length 100
-            vectorLen1 = 100*10; 
+            vectorLen1 = 100*10;
             // produces 10*100 output values
 
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
@@ -682,11 +678,11 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opA+n) = floatTofp32(dist(re));    
+                *(opA+n) = floatTofp32(dist(re));
             }
 
             for (uint32_t n = 0; n < 10; ++n) {
-                *(opB+n) = fmax(round(50.0*dist(re)+49.0),0.0f);  
+                *(opB+n) = fmax(round(50.0*dist(re)+49.0),0.0f);
             }
 
             // dump memroy initialization
@@ -706,8 +702,8 @@ main(int argc, char ** argv) {
                          C_NST_MASK_AUX_CMP_CNT, // auxFunc
                          C_NST_SET_CMD_IRQ,      // irqCfg
                          (0x1 & k));             // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"internal_counter_NST_MASKMAC_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -718,25 +714,25 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
-        }        
+            cnt++;
+        }
 #endif
 
         /////////////////////////////
         // masking
-        // variants 
+        // variants
         // with internal counters
         /////////////////////////////
 
-#ifdef ENABLE_MASKMAC0_TEST  
+#ifdef ENABLE_MASKMAC0_TEST
         for(int k = 0; k < 8; k++) {
 
             // 10 vectors of length 100, stored at the res position
             // each vector has an associated vector with nonzero entries
             // and an offset in opA to be added to the argmax position
-            vectorLen1 = 100; 
+            vectorLen1 = 100;
             vectorLen2 = 10;
             // produces 10*100 output values
 
@@ -748,16 +744,16 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1*vectorLen2; ++n) {
-                *(res+n) = floatTofp32(dist(re));    
+                *(res+n) = floatTofp32(dist(re));
             }
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen2; ++n) {
-                *(opA+n) = floatTofp32(dist(re));    
+                *(opA+n) = floatTofp32(dist(re));
             }
             // generate Argmax indices
             for (uint32_t n = 0; n < vectorLen1*vectorLen2; ++n) {
-                *(opB+n) = floatTofp32(1.0 * (dist(re) >= 0.0));  
+                *(opB+n) = floatTofp32(1.0 * (dist(re) >= 0.0));
             }
 
             // dump memroy initialization
@@ -777,8 +773,8 @@ main(int argc, char ** argv) {
                          (0x3 & k),            // auxFunc
                          C_NST_SET_CMD_IRQ,    // irqCfg
                          (0x1 & (k >> 2)));    // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"internal_counter_NST_MASKMAC_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -789,25 +785,25 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
-        }        
+            cnt++;
+        }
 #endif
 
         /////////////////////////////
         // masking
-        // variants 
+        // variants
         // with internal counters
         /////////////////////////////
 
-#ifdef ENABLE_MASKMAC1_TEST  
+#ifdef ENABLE_MASKMAC1_TEST
         for(int k = 0; k < 2; k++) {
 
             // 10 vectors of length 100, stored at the res position
-            // each vector has an associated argmax position in opB, 
+            // each vector has an associated argmax position in opB,
             // and an offset in opA to be added to the argmax position
-            vectorLen1 = 100; 
+            vectorLen1 = 100;
             vectorLen2 = 10;
             // produces 10*100 output values
 
@@ -819,16 +815,16 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1*vectorLen2; ++n) {
-                *(res+n) = floatTofp32(dist(re));    
+                *(res+n) = floatTofp32(dist(re));
             }
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen2; ++n) {
-                *(opA+n) = floatTofp32(dist(re));    
+                *(opA+n) = floatTofp32(dist(re));
             }
             // generate Argmax indices
             for (uint32_t n = 0; n < vectorLen2; ++n) {
-                *(opB+n) = fmax(round(vectorLen1/2 * dist(re) + vectorLen1/2 - 1),0.0f);  
+                *(opB+n) = fmax(round(vectorLen1/2 * dist(re) + vectorLen1/2 - 1),0.0f);
             }
 
             // dump memroy initialization
@@ -848,8 +844,8 @@ main(int argc, char ** argv) {
                          C_NST_MASK_AUX_CMP_CNT, // auxFunc:
                          C_NST_SET_CMD_IRQ,      // irqCfg
                          (0x1 & k));             // polarity
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"internal_counter_NST_MASKMAC_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -860,20 +856,20 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
-        }        
+            cnt++;
+        }
 #endif
         /////////////////////////////
         // copy variant with init cycle
         /////////////////////////////
 
-#ifdef ENABLE_COPY_TEST0  
+#ifdef ENABLE_COPY_TEST0
         for(int k = 0; k < 2; k++) {
 
             // replicate 100 values from opA (100 vector) to res (10x100 matrix)
-            vectorLen1 = 100; 
+            vectorLen1 = 100;
             vectorLen2 = 10;
 
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
@@ -884,7 +880,7 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1; ++n) {
-                *(opA+n) = floatTofp32(dist(re));    
+                *(opA+n) = floatTofp32(dist(re));
             }
 
             // dump memroy initialization
@@ -904,8 +900,8 @@ main(int argc, char ** argv) {
                          C_NST_COPY_AUX_REPL,    // auxFunc: use init cycle to replicate this value
                          C_NST_SET_CMD_IRQ,      // irqCfg
                          C_NST_POS_POLARITY);    // polarity (unused here)
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"replicate_NST_COPY_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -916,21 +912,21 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
-        }        
+            cnt++;
+        }
 #endif
 
         /////////////////////////////
         // copy variant with vector
         /////////////////////////////
 
-#ifdef ENABLE_COPY_TEST1  
+#ifdef ENABLE_COPY_TEST1
         for(int k = 0; k < 1; k++) {
 
             // copy 100x10 matrix from opA to res
-            vectorLen1 = 100; 
+            vectorLen1 = 100;
             vectorLen2 = 10;
 
             memset(tcdm, 0x55, sizeof(uint32_t)*C_TCDM_MEMSIZE);
@@ -941,7 +937,7 @@ main(int argc, char ** argv) {
 
             // generate some random data
             for (uint32_t n = 0; n < vectorLen1*vectorLen2; ++n) {
-                *(opA+n) = floatTofp32(dist(re));    
+                *(opA+n) = floatTofp32(dist(re));
             }
 
             // dump memroy initialization
@@ -961,8 +957,8 @@ main(int argc, char ** argv) {
                          C_NST_COPY_AUX_VECT,    // auxFunc: use init cycle to replicate this value
                          C_NST_SET_CMD_IRQ,      // irqCfg
                          C_NST_POS_POLARITY);    // polarity (unused here)
-            
-            // dump nst job 
+
+            // dump nst job
             sprintf(str1,"../stimuli/job%d.txt", cnt);
             sprintf(str2,"vector_NST_COPY_OP_%d",k);
             nst.writeJobDump(str1, str2, tcdm);
@@ -973,10 +969,10 @@ main(int argc, char ** argv) {
             // dump expected memory state
             sprintf(str1,"../stimuli/exp%d.txt", cnt);
             writeMemDump(str1, tcdm);
-            
+
             printf("generating job %u: %s\n", cnt, str2);
-            cnt++;   
-        }        
+            cnt++;
+        }
 #endif