diff --git a/example-prjs/leaky_relu/README.md b/example-prjs/leaky_relu/README.md
new file mode 100644
index 0000000000..9abe30e92b
--- /dev/null
+++ b/example-prjs/leaky_relu/README.md
@@ -0,0 +1,6 @@
+This is small conv2d 1 layer example. To run it:
+1. Run the run_catapult.sh script.
+2. Replace the leaky_relu_test.cpp in the my-Catapult-test with the leaky_relu_test.cpp a level up (if you would like the testbench to be self-checking).
+3. Move tb_input_features.dat and tb_output_predictions.dat to my-Catapult-test/tb_data (if you want two pre-computed examples).
+
+Note: You can create your own image matrix or filter and get the predictions by editing then running leaky_relu.py.
diff --git a/example-prjs/leaky_relu/catapult.py b/example-prjs/leaky_relu/catapult.py
new file mode 100644
index 0000000000..52a22e93b7
--- /dev/null
+++ b/example-prjs/leaky_relu/catapult.py
@@ -0,0 +1,42 @@
+import hls4ml
+# import pprint
+import yaml
+import numpy as np
+
+print(hls4ml.__version__)
+
+with open('config.yml', 'r') as ymlfile:
+ config = yaml.safe_load(ymlfile)
+
+# try tweaking the reuse_factor on one layer to get different pipelining
+# config['HLSConfig']['LayerName']['fc1']['ReuseFactor'] = 4
+
+print('NETWORK')
+print(config)
+
+config['OutputDir'] = 'my-Catapult-test'
+config['Backend'] = 'Catapult'
+config['IOType'] = 'io_stream'
+
+config['HLSConfig']['Model']['Strategy'] = 'Latency'
+#config['HLSConfig']['Model']['Strategy'] = 'Resource'
+
+# default threshold is infinity
+config['HLSConfig']['Model']['BramFactor'] = np.inf
+# set to zero to force all weights onto (external function) interface
+config['HLSConfig']['Model']['BramFactor'] = 0
+
+print('CURRENT CONFIGURATION')
+print('Backend='+config['Backend'])
+print('IOType='+config['IOType'])
+print('BramFactor={bf}'.format(bf=config['HLSConfig']['Model']['BramFactor']))
+
+# pprint.pprint(config)
+
+#Convert it to a hls project
+hls_model = hls4ml.converters.keras_to_hls(config)
+
+hls_model.build(vsynth=False)
+
+# URL for this info: https://fastmachinelearning.org/hls4ml/setup/QUICKSTART.html
+
diff --git a/example-prjs/leaky_relu/config.yml b/example-prjs/leaky_relu/config.yml
new file mode 100644
index 0000000000..3c02b585aa
--- /dev/null
+++ b/example-prjs/leaky_relu/config.yml
@@ -0,0 +1,15 @@
+Backend: Catapult
+KerasJson: leaky_relu.json
+KerasH5: leaky_relu_weights.h5
+OutputDir: my-Catapult-test
+ProjectName: leaky_relu
+XilinxPart: xcku115-flvb2104-2-i
+Part: xcku115-flvb2104-2-i
+ClockPeriod: 5
+
+IOType : io_parallel
+HLSConfig:
+ Model:
+ Precision: ap_fixed<16, 6>
+ ReuseFactor: 1
+ Strategy: Latency
diff --git a/example-prjs/leaky_relu/leaky_relu.h5 b/example-prjs/leaky_relu/leaky_relu.h5
new file mode 100644
index 0000000000..83dff7176e
Binary files /dev/null and b/example-prjs/leaky_relu/leaky_relu.h5 differ
diff --git a/example-prjs/leaky_relu/leaky_relu.json b/example-prjs/leaky_relu/leaky_relu.json
new file mode 100644
index 0000000000..77646594a2
--- /dev/null
+++ b/example-prjs/leaky_relu/leaky_relu.json
@@ -0,0 +1 @@
+{"class_name": "Sequential", "config": {"name": "sequential", "layers": [{"class_name": "InputLayer", "config": {"batch_input_shape": [null, 25], "dtype": "float32", "sparse": false, "ragged": false, "name": "input_1"}}, {"class_name": "LeakyReLU", "config": {"name": "leaky_re_lu", "trainable": true, "dtype": "float32", "alpha": 0.30000001192092896}}]}, "keras_version": "2.11.0", "backend": "tensorflow"}
\ No newline at end of file
diff --git a/example-prjs/leaky_relu/leaky_relu.py b/example-prjs/leaky_relu/leaky_relu.py
new file mode 100644
index 0000000000..c8c888f180
--- /dev/null
+++ b/example-prjs/leaky_relu/leaky_relu.py
@@ -0,0 +1,51 @@
+import tensorflow as tf
+import numpy as np
+
+# Create a relu 1layer that takes in a 25 element array
+def create_model():
+ # Create a model
+ model = tf.keras.Sequential()
+ model.add(tf.keras.layers.InputLayer(input_shape=(25,)))
+ model.add(tf.keras.layers.LeakyReLU())
+
+ return model
+
+# Save model to forms for hls4ml
+def save_model(model, name=None):
+ # Save as model.h5, model_weights.h5, and model.json
+ if name is None:
+ name = model.name
+ model.save(name + '.h5')
+ model.save_weights(name + '_weights.h5')
+ with open(name + '.json', 'w') as outfile:
+ outfile.write(model.to_json())
+ return
+
+if __name__ == '__main__':
+ model = create_model()
+ save_model(model, name='leaky_relu')
+
+ # Image Matrix
+ image_mat = np.array([
+ [ 1, -2, 3, -4, 5, -5, 1, -2, 3, -4, 4, -5, 1, -2, 3, -3, 4, -5, 1, -2, 2, -3, 4, -5, 1 ]
+ ])
+
+ # Get prediction
+ prediction = model.predict(image_mat)
+ print("Image Matrix\n")
+ print(image_mat)
+ print("Prediction\n")
+ print(prediction)
+
+ image_mat2 = np.array([
+ [ -1, 2, -3, 4, -5, -6, 7, -8, 9, -10, -11, 12, -13, 14, -15, -16, 17, -18, 19, -20, -21, 22, -23, 24, -25 ]
+ ])
+
+ # Get prediction
+ prediction = model.predict(image_mat2)
+ print("Image Matrix\n")
+ print(image_mat2)
+ print("Prediction\n")
+ print(prediction)
+
+
diff --git a/example-prjs/leaky_relu/leaky_relu_test.cpp b/example-prjs/leaky_relu/leaky_relu_test.cpp
new file mode 100644
index 0000000000..baf746e503
--- /dev/null
+++ b/example-prjs/leaky_relu/leaky_relu_test.cpp
@@ -0,0 +1,134 @@
+//
+// rfnoc-hls-neuralnet: Vivado HLS code for neural-net building blocks
+//
+// Copyright (C) 2017 EJ Kreinar
+//
+// This program is free software: you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation, either version 3 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program. If not, see .
+//
+#include
+#include
+#include
+#include
+#include