/* -*- tab-width: 4 -*- * * Electric(tm) VLSI Design System * * File: AlgoVisualizerV3.java * Written by: Alexander Herzog (Team 4) * * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved. * * Electric(tm) 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. * * Electric(tm) 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 Electric(tm); see the file COPYING. If not, write to * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, * Boston, Mass 02111-1307, USA. */ package com.sun.electric.tool.routing.experimentalLeeMoore2; import java.awt.*; import javax.swing.*; import com.sun.electric.tool.routing.experimentalLeeMoore2.GlobalRouterV3.RegionBorder; import java.awt.geom.*; import java.awt.geom.Rectangle2D.Double; class AlgoVisualizerV3 extends JFrame implements Runnable// create frame for canvas { GCanvas canvas; int seg_id = 0; public AlgoVisualizerV3(GlobalRouterV3 router) // constructor { super("AlgoVisualizer"); setBounds(50,50,1000,800); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Container con=this.getContentPane(); con.setBackground(Color.white); canvas=new GCanvas(router); con.add(canvas); } synchronized public void RepaintVis(int seg_id, Vector2i pos){ canvas.cur_pos = pos; canvas.seg_id = seg_id; canvas.repaint(); } public void run(){ setVisible(true); } } class GCanvas extends Canvas // create a canvas for your graphics { GlobalRouterV3 router; double scale = 1.0d / 2.0d; public int seg_id; Vector2i cur_pos = new Vector2i(-1, -1); public GCanvas(GlobalRouterV3 router){ this.router = router; } public void paint(Graphics g) // display shapes on canvas { Graphics2D g2D=(Graphics2D) g; // cast to 2D g2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); for(int x = 0; x < router.regions_x; ++x){ for(int y = 0; y < router.regions_y; ++y){ Rectangle2D.Double rect = new Rectangle2D.Double(); rect.setFrameFromDiagonal(x * router.region_width * scale, y * router.region_height * scale, (x + 1) * router.region_width * scale, (y + 1) * router.region_height * scale); g2D.draw(rect); BacktraceState min = router.RegionAt(x, y).segment_infos[seg_id].GetMin(Integer.MAX_VALUE); if(min == null){ continue; } float was_visited = router.RegionAt(x, y).segment_infos[seg_id].was_part_of_bt ? 0.0f : 0.5f; was_visited = router.RegionAt(x, y).segment_infos[seg_id].is_initialized ? was_visited : 0.0f; // int supply_left = -1; // int demand_left = -1; // int demand_up= -1; // int supply_up = -1; // RegionBorder border = router.RegionAt(x, y).GetRegionBorder(RegionDirection.rd_left); // if(border != null){ // supply_left = border.GetSupply(); // demand_left = border.GetDemand(); // } // border = router.RegionAt(x, y).GetRegionBorder(RegionDirection.rd_up); // if(border != null){ // supply_up = border.GetSupply(); // demand_up = border.GetDemand(); // } String sdir = ""; switch(min.dir){ case rd_down: sdir = "D"; break; case rd_up: sdir = "U"; break; case rd_left: sdir = "L"; break; case rd_right: sdir = "R"; break; case rd_undefined: sdir = "nDef"; break; } float cheap_path_factor = (float)min.path_length / 15; cheap_path_factor = cheap_path_factor > 1.0f ? 1.0f : cheap_path_factor; Color c = g2D.getColor(); g2D.setColor(new Color(was_visited, 0.0f, cheap_path_factor)); g2D.fill(rect); g2D.setColor(c); g2D.drawString(sdir, (int)(x * router.region_width * scale), (int)(y * router.region_height * scale + g2D.getFont().getSize())); // String supl = Integer.toString(supply_left); // String supu = Integer.toString(supply_up); // String deml = Integer.toString(demand_left); // String demu = Integer.toString(demand_up); // g2D.drawString(deml, (int)(x * router.region_width * scale), (int)(y * router.region_height * scale + router.region_height * scale * 0.5)); // g2D.drawString(demu, (int)(x * router.region_width * scale + router.region_width * scale * 0.5), (int)(y * router.region_height * scale + router.region_height * scale)); } } Rectangle2D.Double r = new Rectangle2D.Double(); r.setFrameFromDiagonal(cur_pos.x * router.region_width * scale, cur_pos.y * router.region_height * scale, (cur_pos.x + 1) * router.region_width * scale, (cur_pos.y + 1) * router.region_height * scale); Color tmp_c = g2D.getColor(); g2D.setColor(Color.BLUE); g2D.draw(r); g2D.setColor(tmp_c); } public void drawArc(Graphics2D g2D,int x1,int y1,int x2,int y2,int sd,int rd,int cl){ Arc2D.Float arc1=new Arc2D.Float(x1,y1,x2,y2,sd,rd,cl); g2D.fill(arc1); } public void drawEllipse(Graphics2D g2D,int x1,int y1,int x2,int y2){ Ellipse2D.Float oval1=new Ellipse2D.Float(x1,y1,x2,y2); g2D.fill(oval1); } }