+ g('\nset term png');
+ g.title('Glitch Training Set');
+ g.xlabel('Time (16MHz)');
+ g.ylabel('VCC (DAC12)');
+
+ g('set datafile separator "|"');
+ g('set term png');
+ g('set output "timevcc.png"');
+ g(script_timevcc);
+ def points(self):
+ c=self.db.cursor();
+ c.execute("select time,vcc,gnd,glitchcount,count from glitches where lock=0 and glitchcount>0;");
+ print "time vcc gnd glitchcount count";
+ for r in c:
+ print "%i %i %i %i %i" % r;
+ def rpoints(self):
+ c=self.db.cursor();
+ c.execute("select time,vcc,gnd,glitchcount,count from glitches where lock=0 and glitchcount>0;");
+ print "time vcc gnd glitchcount count";
+ for r in c:
+ print "%i %i %i %i %i" % r;
+ #GnuPlot sucks for large sets. Switch to viewpoints soon.
+ # sqlite3 glitch.db "select time,vcc,count from glitches where count=0" | vp -l -d "|" -I
+
+ def explore(self,times=None, trials=10):
+ """Exploration phase. Uses thresholds to find exploitable points."""
+ gnd=0;
+ self.scansetup(1); #Lock the chip, place key in eeprom.
+ if times==None:
+ tstart=0;
+ tstop=self.client.glitchstarttime();
+ times=range(tstart,tstop);
+ random.shuffle(times);
+ #self.crunch();
+ count=0.0;
+ total=1.0*len(times);
+
+ c=self.db.cursor();
+ c.execute("select time,min,max from glitchrange where max-min>0;");
+ rows=c.fetchall();
+ c.close();
+ random.shuffle(rows);
+ print "Exploring %i times." % len(times);
+ mins={};
+ maxes={};
+ for r in rows:
+ t=r[0];
+ mins[t]=r[1];
+ maxes[t]=r[2];
+ for t in times:
+ min=mins[t];
+ max=maxes[t];
+ voltages=range(min,max,1);
+ count=count+1.0;
+ print "%02.02f Exploring %04i points in t=%04i." % (count/total,len(voltages),t);
+ sys.stdout.flush();
+ for vcc in voltages:
+ self.scanat(1,trials,vcc,gnd,t);