diff --git a/dump_bram.java b/dump_bram.java
index 7391f92..553c056 100644
--- a/dump_bram.java
+++ b/dump_bram.java
@@ -26,6 +26,8 @@
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.Collections;
+import java.util.List;
 
 public class dump_bram {
 
@@ -303,6 +305,8 @@
             }
             FileWriter vf = new FileWriter(f.replace(".dcp", "_o3.features"), false);
             PrintWriter v = new PrintWriter(vf);
+
+            List<String> tiles = new ArrayList<String>();
             for (Tile t : des.getDevice().getAllTiles()) {
                 TileTypeEnum tt = t.getTileTypeEnum();
                 if (tt == TileTypeEnum.BRAM || tt == TileTypeEnum.DSP || tt == TileTypeEnum.DSP_L || tt == TileTypeEnum.DSP_R ||
@@ -310,13 +314,26 @@
                     String tname = t.getName() + ":" + tt.toString();
                     if (!pips_by_tile.containsKey(tname) && !sitefeatures_by_tile.containsKey(tname))
                         continue;
-                    v.println(".tile " + tname);
-                    if (pips_by_tile.containsKey(tname))
-                        for (String p : pips_by_tile.get(tname))
-                            v.println(p);
-                    if (sitefeatures_by_tile.containsKey(tname))
-                        for (String sf : sitefeatures_by_tile.get(tname))
-                            v.println(sf);
+                    tiles.add(tname);
+                }
+            }
+
+            Collections.sort(tiles);
+            for(String tname : tiles) {
+                v.println(".tile " + tname);
+                if (pips_by_tile.containsKey(tname)) {
+                    List<String> features = pips_by_tile.get(tname);
+                    Collections.sort(features);
+                    for (String p : features) {
+                        v.println(p);
+                    }
+                }
+                if (sitefeatures_by_tile.containsKey(tname)) {
+                    List<String> features = sitefeatures_by_tile.get(tname);
+                    Collections.sort(features);
+                    for (String sf : features) {
+                        v.println(sf);
+                    }
                 }
             }
             vf.close();
diff --git a/dump_clocking.java b/dump_clocking.java
index d3d5a5d..dac3683 100644
--- a/dump_clocking.java
+++ b/dump_clocking.java
@@ -27,6 +27,8 @@
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Scanner;
+import java.util.Collections;
+import java.util.List;
 
 public class dump_clocking {
     static String site_index_in_tile(Tile t, Site s) {
@@ -432,6 +434,8 @@
             }
             FileWriter vf = new FileWriter(f.replace(".dcp", "_o2.features"), false);
             PrintWriter v = new PrintWriter(vf);
+
+            List<String> tiles = new ArrayList<String>();
             for (Tile t : des.getDevice().getAllTiles()) {
                 TileTypeEnum tt = t.getTileTypeEnum();
                 if (tt == TileTypeEnum.RCLK_INT_L|| tt == TileTypeEnum.RCLK_CLEM_L || tt == TileTypeEnum.RCLK_INT_R || tt == TileTypeEnum.RCLK_CLEM_CLKBUF_L || tt == TileTypeEnum.RCLK_CLEM_R ||
@@ -444,13 +448,26 @@
                     String tname = t.getName() + ":" + tt.toString();
                     if (!pips_by_tile.containsKey(tname) && !sitefeatures_by_tile.containsKey(tname))
                         continue;
-                    v.println(".tile " + tname);
-                    if (pips_by_tile.containsKey(tname))
-                        for (String p : pips_by_tile.get(tname))
-                            v.println(p);
-                    if (sitefeatures_by_tile.containsKey(tname))
-                        for (String sf : sitefeatures_by_tile.get(tname))
-                            v.println(sf);
+                    tiles.add(tname);
+                }
+            }
+
+            Collections.sort(tiles);
+            for(String tname : tiles) {
+                v.println(".tile " + tname);
+                if (pips_by_tile.containsKey(tname)) {
+                    List<String> features = pips_by_tile.get(tname);
+                    Collections.sort(features);
+                    for (String p : features) {
+                        v.println(p);
+                    }
+                }
+                if (sitefeatures_by_tile.containsKey(tname)) {
+                    List<String> features = sitefeatures_by_tile.get(tname);
+                    Collections.sort(features);
+                    for (String sf : features) {
+                        v.println(sf);
+                    }
                 }
             }
             vf.close();
diff --git a/dump_features.java b/dump_features.java
index 3dbd107..ffc90e7 100644
--- a/dump_features.java
+++ b/dump_features.java
@@ -28,7 +28,6 @@
 import java.util.*;
 
 public class dump_features {
-
     static String site_index_in_tile(Tile t, Site s) {
         int min_x = s.getInstanceX(), min_y = s.getInstanceY();
         for (Site s2 : t.getSites()) {
@@ -377,6 +376,8 @@
             }
             FileWriter vf = new FileWriter(f.replace(".dcp", "_o1.features"), false);
             PrintWriter v = new PrintWriter(vf);
+
+            List<String> tiles = new ArrayList<String>();
             for (Tile t : des.getDevice().getAllTiles()) {
                 TileTypeEnum tt = t.getTileTypeEnum();
                 if (tt == TileTypeEnum.CLEL_L || tt == TileTypeEnum.CLEL_R || tt == TileTypeEnum.CLEM_R || tt == TileTypeEnum.CLEM
@@ -384,13 +385,26 @@
                     String tname = t.getName() + ":" + tt.toString();
                     if (!pips_by_tile.containsKey(tname) && !sitefeatures_by_tile.containsKey(tname))
                         continue;
-                    v.println(".tile " + tname);
-                    if (pips_by_tile.containsKey(tname))
-                        for (String p : pips_by_tile.get(tname))
-                            v.println(p);
-                    if (sitefeatures_by_tile.containsKey(tname))
-                        for (String sf : sitefeatures_by_tile.get(tname))
-                            v.println(sf);
+                    tiles.add(tname);
+                }
+            }
+
+            Collections.sort(tiles);
+            for(String tname : tiles) {
+                v.println(".tile " + tname);
+                if (pips_by_tile.containsKey(tname)) {
+                    List<String> features = pips_by_tile.get(tname);
+                    Collections.sort(features);
+                    for (String p : features) {
+                        v.println(p);
+                    }
+                }
+                if (sitefeatures_by_tile.containsKey(tname)) {
+                    List<String> features = sitefeatures_by_tile.get(tname);
+                    Collections.sort(features);
+                    for (String sf : features) {
+                        v.println(sf);
+                    }
                 }
             }
             vf.close();
