/* This file is part of JOP, the Java Optimized Processor see <http://www.jopdesign.com/> Copyright (C) 2001-2008, Martin Schoeberl (martin@jopdesign.com) This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 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 <http://www.gnu.org/licenses/>. */ package wcet; import com.jopdesign.sys.*; /* Testing the Receiver Type analysis */ public class Delegator { public static final boolean MEASURE = true; interface Reader { char getChar(); } static class SubstReader implements Reader { private Reader reader; private char pattern,replace; public SubstReader(Reader r, char pat, char repl) { reader = r; pattern = pat; replace = repl; } public char getChar() { char c = reader.getChar(); if(c == pattern) return replace; else return c; } } /* Linebreak conversion: "\r\n" -> "\n" */ static class LBCReader implements Reader { private Reader reader; private int buf; public LBCReader(Reader r) { reader = r; buf = -1; } public char getChar() { char c; if(buf >= 0) { c = (char)buf; buf = -1; } else { c = reader.getChar(); } if(c != '\r') { return c; } else { char c2 = reader.getChar(); if(c2 == '\n') { return c2; } else { buf = c2; return c; } } } } static class ConstReader implements Reader { private int state; public ConstReader() { state = 1; } public char getChar() { return (state == 0 ? '\r' : '\n'); } } static int ts, te, to; /** * @param args */ public static void main(String[] args) { ts = Native.rdMem(Const.IO_CNT); te = Native.rdMem(Const.IO_CNT); to = te-ts; // measurement + return takes 22+22+21=65 cycles // WCET measured: 2312 // WCET analysed: 2377 Reader r1,r2; r1 = new SubstReader(new ConstReader(),'\n','\t'); r2 = new SubstReader(new LBCReader(new ConstReader()),'\n','\t'); if(to < 20) { /* confuse DFA a little */ Reader tmp = r1; r1 = r2; r2 = tmp; } measure(r1); System.out.print("t1: "); System.out.println(te-ts-to); measure(r2); System.out.print("t2: "); System.out.println(te-ts-to); } static int measure(Reader r) { int val = 1; if(MEASURE) ts = Native.rdMem(Const.IO_CNT); for (int i=0; i<100; ++i) { // @WCA loop=100 val += (int) r.getChar(); } if(MEASURE) te = Native.rdMem(Const.IO_CNT); return val; } }