<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 Sine Wave Generator
Step1:  To implement our sine wave generator, we'll use a counter to index into a ROM that is programmed to output the value of discrete points in the sine wave.
Step2:  Compile and test.
Step3:  We can wire up the GPIO pins to a logic analyzer to verify that our circuit produces the correct sine waveform.
We can also use Saleae's export data feature to output a csv file. We'll load this data into Python and plot the results.
Step4:  TODO
<ASSISTANT_TASK:>
Python Code:
import math
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def sine(x):
    return np.sin(2 * math.pi * x)
x = np.linspace(0., 1., num=256, endpoint=False)
plt.plot(x, sine(x))
import magma as m
m.set_mantle_target("ice40")
import mantle
from loam.boards.icestick import IceStick
N = 8
icestick = IceStick()
icestick.Clock.on()
for i in range(N):
    icestick.J3[i].output().on()
Explanation: Sine Wave Generator
End of explanation
main = icestick.main()
counter = mantle.Counter(32)
sawtooth = counter.O[8:8+8]
wavetable = 128 + 127 * sine(x)
wavetable = [int(x) for x in wavetable]
rom = mantle.Memory(height=256, width=16, rom=list(wavetable), readonly=True)
m.wire( rom(sawtooth)[0:8], main.J3 )
m.wire( 1, rom.RE )
m.EndCircuit()
Explanation: To implement our sine wave generator, we'll use a counter to index into a ROM that is programmed to output the value of discrete points in the sine wave.
End of explanation
m.compile('build/sin', main)
%%bash
cd build
cat sin.pcf
yosys -q -p 'synth_ice40 -top main -blif sin.blif' sin.v
arachne-pnr -q -d 1k -o sin.txt -p sin.pcf sin.blif 
icepack sin.txt sin.bin
iceprog sin.bin
Explanation: Compile and test.
End of explanation
import csv
import magma as m
with open("data/sine-capture.csv") as sine_capture_csv:
    csv_reader = csv.reader(sine_capture_csv)
    next(csv_reader, None)  # skip the headers
    rows = [row for row in csv_reader]
timestamps = [float(row[0]) for row in rows]
values = [m.bitutils.seq2int(tuple(int(x) for x in row[1:])) for row in rows]
Explanation: We can wire up the GPIO pins to a logic analyzer to verify that our circuit produces the correct sine waveform.
We can also use Saleae's export data feature to output a csv file. We'll load this data into Python and plot the results.
End of explanation
plt.plot(timestamps[:250], values[:250], "b.")
Explanation: TODO: Why do we have this jitter? Logic analyzer is running at 25 MS/s, 3.3+ Volts for 1s
End of explanation
<END_TASK>