124 lines
2.7 KiB
PHP
124 lines
2.7 KiB
PHP
<?php
|
|
|
|
// helpers
|
|
function hex($int)
|
|
{
|
|
$h = dechex($int);
|
|
if (strlen($h)%2 != 0)
|
|
{
|
|
$h = str_pad($h, strlen($h) + 1, '0', STR_PAD_LEFT);
|
|
}
|
|
return strtoupper($h)."h";
|
|
}
|
|
function ValidateRef($ref)
|
|
{
|
|
$ref = str_replace("-", "_", $ref);
|
|
$ref = str_replace("*", "", $ref);
|
|
$ref = str_replace("?", "", $ref);
|
|
$ref = str_replace(".", "", $ref);
|
|
$ref = str_replace("+", "", $ref);
|
|
if (!trim($ref)) $ref = "UNK";
|
|
return $ref;
|
|
}
|
|
function getNetByPadOfs($pcb, $ofs)
|
|
{
|
|
for($i=1; $i<=$pcb->HDR['comp_count_real']['v']; $i++)
|
|
{
|
|
for ($j=1; $j<=$pcb->COMP[$i]['pads_count']['v']; $j++)
|
|
{
|
|
$pad_ofs = $pcb->COMP[$i]['pad'.$j.'_ofs']['v'];
|
|
if ($pad_ofs == $ofs)
|
|
{
|
|
return $pcb->COMP[$i]['pad'.$j.'_net']['v'];
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// include class
|
|
include("p/" . $proj[$PROJ_ID]['dir'] . "/Class_OrCad21.php");
|
|
|
|
// parse
|
|
// ------------------------------------------------------------------------------------------------
|
|
$pcb = new orcad21("p/" . $proj[$PROJ_ID]['dir'] . "/sprint05.pcb");
|
|
echo"file size = [".$pcb->FileSize."]<br>";
|
|
|
|
if (!$pcb->Parse())
|
|
{
|
|
echo"parser error<br>";
|
|
return;
|
|
}
|
|
|
|
// print results
|
|
// ------------------------------------------------------------------------------------------------
|
|
echo"min_x = ".$pcb->MinPosX.", min_y = ".$pcb->MinPosY."<br>";
|
|
echo"max_x = ".$pcb->MaxPosX.", max_y = ".$pcb->MaxPosY."<br>";
|
|
|
|
// transform all coordinates from "orcad-top-left" to "pcad-bottom-left"
|
|
$pcb->ChangePos(0,0, 0,($pcb->MaxPosY + $pcb->MinPosY), 1);
|
|
|
|
// check ref duplicated
|
|
$REF = array();
|
|
echo"validate ref...<br>";
|
|
for($i=1; $i<=$pcb->HDR['comp_count_real']['v']; $i++)
|
|
{
|
|
$ref1 = $pcb->COMP[$i]['name1_str']['v'];
|
|
$ref2 = ValidateRef($pcb->COMP[$i]['name1_str']['v']);
|
|
if ($ref1 != $ref2)
|
|
{
|
|
echo"name [$ref1] change to [$ref2]<br>";
|
|
$pcb->COMP[$i]['name1_str']['v'] = $ref2;
|
|
}
|
|
|
|
}
|
|
|
|
echo"check duplicates...<br>";
|
|
$found = 0;
|
|
for($i=1; $i<=$pcb->HDR['comp_count_real']['v']; $i++)
|
|
{
|
|
$ref = $pcb->COMP[$i]['name1_str']['v'];
|
|
$REF[$ref] = $REF[$ref] + 1;
|
|
if ($REF[$ref] > 1)
|
|
$found = 1;
|
|
}
|
|
if ($found)
|
|
{
|
|
echo"duplicate found!<br>";
|
|
foreach ($REF as $ref => $m)
|
|
{
|
|
if ($REF[$ref] > 1)
|
|
{
|
|
echo"[$ref] = ".$REF[$ref]."<br>";
|
|
$id = 1;
|
|
for($i=0; $i<=$pcb->HDR['comp_count_real']['v']; $i++)
|
|
{
|
|
$comp_ref = $pcb->COMP[$i]['name1_str']['v'];
|
|
if ($comp_ref == $ref)
|
|
{
|
|
$pcb->COMP[$i]['name1_str']['v'] = $comp_ref . "_DUP".$id;
|
|
$id++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
$REF = array();
|
|
echo"check duplicates...<br>";
|
|
$found = 0;
|
|
for($i=1; $i<=$pcb->HDR['comp_count_real']['v']; $i++)
|
|
{
|
|
$ref = $pcb->COMP[$i]['name1_str']['v'];
|
|
$REF[$ref] = $REF[$ref] + 1;
|
|
if ($REF[$ref] > 1)
|
|
$found = 1;
|
|
}
|
|
if ($found)
|
|
echo"duplicate found!<br>";
|
|
else
|
|
echo"no duplicates now<br>";
|
|
|
|
echo"<br>";
|
|
|
|
// build ...
|